New York City Taxi Trip Duration

평가함수(Evalution)

  • RMSLE(Root Mean Squared Logarithmic Error) \[\epsilon = \sqrt{\frac{1}{n} \sum_{i=1}^n (\log(p_i + 1) - \log(a_i+1))^2 }\]
id,trip_duration
id00001,978
id00002,978
id00003,978
id00004,978
etc.

Data 소개

  • 경쟁 데이터 세트는 Google Cloud Platform의 Big Query에서 제공되는 2016 년 NYC Yellow Cab 여행 기록 데이터를 기반으로합니다.

  • 이 데이터는 원래 NYC 택시 및 리무진위원회 (TLC)에서 발간 한 것입니다.

  • 데이터는 이 놀이터 경쟁의 목적을 위해 샘플링되고 청소되었습니다.
  • 참가자는 개별 여행 속성에 따라 테스트 세트의 각 여행 기간을 예측해야 합니다.

데이터 필드

  • id : 각 출장의 고유 식별자
  • vendor_id : 여행 기록과 연결된 공급자를 나타내는 코드
  • pickup_datetime : 미터가 작동 된 날짜와 시간
  • dropoff_datetime : 미터가 분리 된 날짜와 시간
  • passenger_count : 차량의 승객 수 (운전자가 입력 한 값)
  • pickup_longitude : 미터가 사용 된 경도
  • pickup_latitude : 미터가 사용 된 위도
  • dropoff_longitude : 미터가 분리 된 경도
  • dropoff_latitude : 미터가 분리 된 위도
  • store_and_fwd_flag : 플래그는 자동차가 서버에 연결되어 있지 않아 여행 기록이 차량 메모리에 보관되었는지 여부를 나타냅니다.
  • Y = 저장 및 전달; N = 상점 및 순회 여행 불가

  • trip_duration : 여행 기간 (초)

  • 면책 조항 : 커널에서 사용할 확장 된 변수 집합을 제공하기 위해 데이터 집합 순서에서 드롭 오프 좌표를 제거하지 않기로 결정했습니다.

1단계. 데이터 전처리

#install.packages(c('flexdashboard', 'TraMineR', 'leaflet', 'treemap', 'highcharter', 'zoo')
#라이브러리 로딩
library(data.table)
library(dplyr)
library(ggplot2)
library(flexdashboard)
library(TraMineR)
library(highcharter)
library(DT)
library(flexdashboard)
library(leaflet)
library(rmarkdown)
library(treemap)
library(viridisLite)
library(tidyverse)
library(geosphere)
library(caret)
library(ggmap)
library(scales)
library(ggthemes)
library(gridExtra)
library(sp)
library(lubridate)
library(grid)
rm(list=ls())
fillColor = "#ff9999"
train = read_csv("./data/train.csv")
Parsed with column specification:
cols(
  id = col_character(),
  vendor_id = col_integer(),
  pickup_datetime = col_datetime(format = ""),
  dropoff_datetime = col_datetime(format = ""),
  passenger_count = col_integer(),
  pickup_longitude = col_double(),
  pickup_latitude = col_double(),
  dropoff_longitude = col_double(),
  dropoff_latitude = col_double(),
  store_and_fwd_flag = col_character(),
  trip_duration = col_integer()
)

|              |   5%   10 MB
|              |   5%   10 MB
|              |   5%   10 MB
|              |   5%   10 MB
|              |   5%   10 MB
|              |   5%   10 MB
|              |   5%   10 MB
|              |   5%   10 MB
|              |   5%   10 MB
|              |   5%   11 MB
|              |   5%   11 MB
|              |   5%   11 MB
|              |   5%   11 MB
|              |   6%   11 MB
|              |   6%   11 MB
|              |   6%   11 MB
|              |   6%   11 MB
|              |   6%   12 MB
|              |   6%   12 MB
|              |   6%   12 MB
|              |   6%   12 MB
|              |   6%   12 MB
|              |   6%   12 MB
|=             |   6%   12 MB
|=             |   6%   12 MB
|=             |   6%   12 MB
|=             |   6%   13 MB
|=             |   6%   13 MB
|=             |   6%   13 MB
|=             |   7%   13 MB
|=             |   7%   13 MB
|=             |   7%   13 MB
|=             |   7%   13 MB
|=             |   7%   13 MB
|=             |   7%   14 MB
|=             |   7%   14 MB
|=             |   7%   14 MB
|=             |   7%   14 MB
|=             |   7%   14 MB
|=             |   7%   14 MB
|=             |   7%   14 MB
|=             |   7%   14 MB
|=             |   7%   15 MB
|=             |   7%   15 MB
|=             |   7%   15 MB
|=             |   8%   15 MB
|=             |   8%   15 MB
|=             |   8%   15 MB
|=             |   8%   15 MB
|=             |   8%   15 MB
|=             |   8%   15 MB
|=             |   8%   16 MB
|=             |   8%   16 MB
|=             |   8%   16 MB
|=             |   8%   16 MB
|=             |   8%   16 MB
|=             |   8%   16 MB
|=             |   8%   16 MB
|=             |   8%   16 MB
|=             |   8%   17 MB
|=             |   8%   17 MB
|=             |   9%   17 MB
|=             |   9%   17 MB
|=             |   9%   17 MB
|=             |   9%   17 MB
|=             |   9%   17 MB
|=             |   9%   17 MB
|=             |   9%   18 MB
|=             |   9%   18 MB
|=             |   9%   18 MB
|=             |   9%   18 MB
|=             |   9%   18 MB
|=             |   9%   18 MB
|=             |   9%   18 MB
|=             |   9%   18 MB
|=             |   9%   18 MB
|=             |   9%   19 MB
|=             |  10%   19 MB
|=             |  10%   19 MB
|=             |  10%   19 MB
|=             |  10%   19 MB
|=             |  10%   19 MB
|=             |  10%   19 MB
|=             |  10%   19 MB
|=             |  10%   20 MB
|=             |  10%   20 MB
|=             |  10%   20 MB
|=             |  10%   20 MB
|=             |  10%   20 MB
|=             |  10%   20 MB
|=             |  10%   20 MB
|=             |  10%   20 MB
|=             |  10%   20 MB
|=             |  11%   21 MB
|=             |  11%   21 MB
|=             |  11%   21 MB
|=             |  11%   21 MB
|=             |  11%   21 MB
|=             |  11%   21 MB
|=             |  11%   21 MB
|=             |  11%   21 MB
|=             |  11%   22 MB
|=             |  11%   22 MB
|=             |  11%   22 MB
|=             |  11%   22 MB
|=             |  11%   22 MB
|=             |  11%   22 MB
|=             |  11%   22 MB
|=             |  11%   22 MB
|=             |  12%   23 MB
|=             |  12%   23 MB
|=             |  12%   23 MB
|=             |  12%   23 MB
|=             |  12%   23 MB
|=             |  12%   23 MB
|=             |  12%   23 MB
|=             |  12%   23 MB
|=             |  12%   23 MB
|=             |  12%   24 MB
|=             |  12%   24 MB
|=             |  12%   24 MB
|=             |  12%   24 MB
|=             |  12%   24 MB
|=             |  12%   24 MB
|=             |  12%   24 MB
|=             |  13%   24 MB
|=             |  13%   25 MB
|=             |  13%   25 MB
|=             |  13%   25 MB
|=             |  13%   25 MB
|==            |  13%   25 MB
|==            |  13%   25 MB
|==            |  13%   25 MB
|==            |  13%   25 MB
|==            |  13%   25 MB
|==            |  13%   26 MB
|==            |  13%   26 MB
|==            |  13%   26 MB
|==            |  13%   26 MB
|==            |  13%   26 MB
|==            |  13%   26 MB
|==            |  14%   26 MB
|==            |  14%   26 MB
|==            |  14%   27 MB
|==            |  14%   27 MB
|==            |  14%   27 MB
|==            |  14%   27 MB
|==            |  14%   27 MB
|==            |  14%   27 MB
|==            |  14%   27 MB
|==            |  14%   27 MB
|==            |  14%   28 MB
|==            |  14%   28 MB
|==            |  14%   28 MB
|==            |  14%   28 MB
|==            |  14%   28 MB
|==            |  14%   28 MB
|==            |  15%   28 MB
|==            |  15%   28 MB
|==            |  15%   28 MB
|==            |  15%   29 MB
|==            |  15%   29 MB
|==            |  15%   29 MB
|==            |  15%   29 MB
|==            |  15%   29 MB
|==            |  15%   29 MB
|==            |  15%   29 MB
|==            |  15%   29 MB
|==            |  15%   30 MB
|==            |  15%   30 MB
|==            |  15%   30 MB
|==            |  15%   30 MB
|==            |  15%   30 MB
|==            |  16%   30 MB
|==            |  16%   30 MB
|==            |  16%   30 MB
|==            |  16%   30 MB
|==            |  16%   31 MB
|==            |  16%   31 MB
|==            |  16%   31 MB
|==            |  16%   31 MB
|==            |  16%   31 MB
|==            |  16%   31 MB
|==            |  16%   31 MB
|==            |  16%   31 MB
|==            |  16%   32 MB
|==            |  16%   32 MB
|==            |  16%   32 MB
|==            |  16%   32 MB
|==            |  17%   32 MB
|==            |  17%   32 MB
|==            |  17%   32 MB
|==            |  17%   32 MB
|==            |  17%   33 MB
|==            |  17%   33 MB
|==            |  17%   33 MB
|==            |  17%   33 MB
|==            |  17%   33 MB
|==            |  17%   33 MB
|==            |  17%   33 MB
|==            |  17%   33 MB
|==            |  17%   33 MB
|==            |  17%   34 MB
|==            |  17%   34 MB
|==            |  17%   34 MB
|==            |  18%   34 MB
|==            |  18%   34 MB
|==            |  18%   34 MB
|==            |  18%   34 MB
|==            |  18%   34 MB
|==            |  18%   35 MB
|==            |  18%   35 MB
|==            |  18%   35 MB
|==            |  18%   35 MB
|==            |  18%   35 MB
|==            |  18%   35 MB
|==            |  18%   35 MB
|==            |  18%   35 MB
|==            |  18%   36 MB
|==            |  18%   36 MB
|==            |  18%   36 MB
|==            |  19%   36 MB
|==            |  19%   36 MB
|==            |  19%   36 MB
|==            |  19%   36 MB
|==            |  19%   36 MB
|==            |  19%   36 MB
|==            |  19%   37 MB
|==            |  19%   37 MB
|==            |  19%   37 MB
|==            |  19%   37 MB
|==            |  19%   37 MB
|==            |  19%   37 MB
|==            |  19%   37 MB
|==            |  19%   37 MB
|==            |  19%   38 MB
|==            |  19%   38 MB
|===           |  20%   38 MB
|===           |  20%   38 MB
|===           |  20%   38 MB
|===           |  20%   38 MB
|===           |  20%   38 MB
|===           |  20%   38 MB
|===           |  20%   38 MB
|===           |  20%   39 MB
|===           |  20%   39 MB
|===           |  20%   39 MB
|===           |  20%   39 MB
|===           |  20%   39 MB
|===           |  20%   39 MB
|===           |  20%   39 MB
|===           |  20%   39 MB
|===           |  20%   40 MB
|===           |  21%   40 MB
|===           |  21%   40 MB
|===           |  21%   40 MB
|===           |  21%   40 MB
|===           |  21%   40 MB
|===           |  21%   40 MB
|===           |  21%   40 MB
|===           |  21%   41 MB
|===           |  21%   41 MB
|===           |  21%   41 MB
|===           |  21%   41 MB
|===           |  21%   41 MB
|===           |  21%   41 MB
|===           |  21%   41 MB
|===           |  21%   41 MB
|===           |  21%   41 MB
|===           |  22%   42 MB
|===           |  22%   42 MB
|===           |  22%   42 MB
|===           |  22%   42 MB
|===           |  22%   42 MB
|===           |  22%   42 MB
|===           |  22%   42 MB
|===           |  22%   42 MB
|===           |  22%   43 MB
|===           |  22%   43 MB
|===           |  22%   43 MB
|===           |  22%   43 MB
|===           |  22%   43 MB
|===           |  22%   43 MB
|===           |  22%   43 MB
|===           |  22%   43 MB
|===           |  22%   43 MB
|===           |  23%   44 MB
|===           |  23%   44 MB
|===           |  23%   44 MB
|===           |  23%   44 MB
|===           |  23%   44 MB
|===           |  23%   44 MB
|===           |  23%   44 MB
|===           |  23%   44 MB
|===           |  23%   45 MB
|===           |  23%   45 MB
|===           |  23%   45 MB
|===           |  23%   45 MB
|===           |  23%   45 MB
|===           |  23%   45 MB
|===           |  23%   45 MB
|===           |  23%   45 MB
|===           |  24%   46 MB
|===           |  24%   46 MB
|===           |  24%   46 MB
|===           |  24%   46 MB
|===           |  24%   46 MB
|===           |  24%   46 MB
|===           |  24%   46 MB
|===           |  24%   46 MB
|===           |  24%   46 MB
|===           |  24%   47 MB
|===           |  24%   47 MB
|===           |  24%   47 MB
|===           |  24%   47 MB
|===           |  24%   47 MB
|===           |  24%   47 MB
|===           |  24%   47 MB
|===           |  25%   47 MB
|===           |  25%   48 MB
|===           |  25%   48 MB
|===           |  25%   48 MB
|===           |  25%   48 MB
|===           |  25%   48 MB
|===           |  25%   48 MB
|===           |  25%   48 MB
|===           |  25%   48 MB
|===           |  25%   49 MB
|===           |  25%   49 MB
|===           |  25%   49 MB
|===           |  25%   49 MB
|===           |  25%   49 MB
|===           |  25%   49 MB
|===           |  25%   49 MB
|===           |  26%   49 MB
|===           |  26%   49 MB
|===           |  26%   50 MB
|===           |  26%   50 MB
|===           |  26%   50 MB
|===           |  26%   50 MB
|===           |  26%   50 MB
|===           |  26%   50 MB
|===           |  26%   50 MB
|===           |  26%   50 MB
|====          |  26%   51 MB
|====          |  26%   51 MB
|====          |  26%   51 MB
|====          |  26%   51 MB
|====          |  26%   51 MB
|====          |  26%   51 MB
|====          |  27%   51 MB
|====          |  27%   51 MB
|====          |  27%   51 MB
|====          |  27%   52 MB
|====          |  27%   52 MB
|====          |  27%   52 MB
|====          |  27%   52 MB
|====          |  27%   52 MB
|====          |  27%   52 MB
|====          |  27%   52 MB
|====          |  27%   52 MB
|====          |  27%   53 MB
|====          |  27%   53 MB
|====          |  27%   53 MB
|====          |  27%   53 MB
|====          |  27%   53 MB
|====          |  28%   53 MB
|====          |  28%   53 MB
|====          |  28%   53 MB
|====          |  28%   54 MB
|====          |  28%   54 MB
|====          |  28%   54 MB
|====          |  28%   54 MB
|====          |  28%   54 MB
|====          |  28%   54 MB
|====          |  28%   54 MB
|====          |  28%   54 MB
|====          |  28%   54 MB
|====          |  28%   55 MB
|====          |  28%   55 MB
|====          |  28%   55 MB
|====          |  28%   55 MB
|====          |  29%   55 MB
|====          |  29%   55 MB
|====          |  29%   55 MB
|====          |  29%   55 MB
|====          |  29%   56 MB
|====          |  29%   56 MB
|====          |  29%   56 MB
|====          |  29%   56 MB
|====          |  29%   56 MB
|====          |  29%   56 MB
|====          |  29%   56 MB
|====          |  29%   56 MB
|====          |  29%   56 MB
|====          |  29%   57 MB
|====          |  29%   57 MB
|====          |  29%   57 MB
|====          |  30%   57 MB
|====          |  30%   57 MB
|====          |  30%   57 MB
|====          |  30%   57 MB
|====          |  30%   57 MB
|====          |  30%   58 MB
|====          |  30%   58 MB
|====          |  30%   58 MB
|====          |  30%   58 MB
|====          |  30%   58 MB
|====          |  30%   58 MB
|====          |  30%   58 MB
|====          |  30%   58 MB
|====          |  30%   59 MB
|====          |  30%   59 MB
|====          |  30%   59 MB
|====          |  31%   59 MB
|====          |  31%   59 MB
|====          |  31%   59 MB
|====          |  31%   59 MB
|====          |  31%   59 MB
|====          |  31%   59 MB
|====          |  31%   60 MB
|====          |  31%   60 MB
|====          |  31%   60 MB
|====          |  31%   60 MB
|====          |  31%   60 MB
|====          |  31%   60 MB
|====          |  31%   60 MB
|====          |  31%   60 MB
|====          |  31%   61 MB
|====          |  31%   61 MB
|====          |  32%   61 MB
|====          |  32%   61 MB
|====          |  32%   61 MB
|====          |  32%   61 MB
|====          |  32%   61 MB
|====          |  32%   61 MB
|====          |  32%   61 MB
|====          |  32%   62 MB
|====          |  32%   62 MB
|====          |  32%   62 MB
|====          |  32%   62 MB
|====          |  32%   62 MB
|====          |  32%   62 MB
|====          |  32%   62 MB
|====          |  32%   62 MB
|====          |  32%   63 MB
|====          |  33%   63 MB
|====          |  33%   63 MB
|====          |  33%   63 MB
|====          |  33%   63 MB
|====          |  33%   63 MB
|=====         |  33%   63 MB
|=====         |  33%   63 MB
|=====         |  33%   64 MB
|=====         |  33%   64 MB
|=====         |  33%   64 MB
|=====         |  33%   64 MB
|=====         |  33%   64 MB
|=====         |  33%   64 MB
|=====         |  33%   64 MB
|=====         |  33%   64 MB
|=====         |  33%   64 MB
|=====         |  34%   65 MB
|=====         |  34%   65 MB
|=====         |  34%   65 MB
|=====         |  34%   65 MB
|=====         |  34%   65 MB
|=====         |  34%   65 MB
|=====         |  34%   65 MB
|=====         |  34%   65 MB
|=====         |  34%   66 MB
|=====         |  34%   66 MB
|=====         |  34%   66 MB
|=====         |  34%   66 MB
|=====         |  34%   66 MB
|=====         |  34%   66 MB
|=====         |  34%   66 MB
|=====         |  34%   66 MB
|=====         |  35%   67 MB
|=====         |  35%   67 MB
|=====         |  35%   67 MB
|=====         |  35%   67 MB
|=====         |  35%   67 MB
|=====         |  35%   67 MB
|=====         |  35%   67 MB
|=====         |  35%   67 MB
|=====         |  35%   67 MB
|=====         |  35%   68 MB
|=====         |  35%   68 MB
|=====         |  35%   68 MB
|=====         |  35%   68 MB
|=====         |  35%   68 MB
|=====         |  35%   68 MB
|=====         |  35%   68 MB
|=====         |  36%   68 MB
|=====         |  36%   69 MB
|=====         |  36%   69 MB
|=====         |  36%   69 MB
|=====         |  36%   69 MB
|=====         |  36%   69 MB
|=====         |  36%   69 MB
|=====         |  36%   69 MB
|=====         |  36%   69 MB
|=====         |  36%   69 MB
|=====         |  36%   70 MB
|=====         |  36%   70 MB
|=====         |  36%   70 MB
|=====         |  36%   70 MB
|=====         |  36%   70 MB
|=====         |  36%   70 MB
|=====         |  37%   70 MB
|=====         |  37%   70 MB
|=====         |  37%   71 MB
|=====         |  37%   71 MB
|=====         |  37%   71 MB
|=====         |  37%   71 MB
|=====         |  37%   71 MB
|=====         |  37%   71 MB
|=====         |  37%   71 MB
|=====         |  37%   71 MB
|=====         |  37%   72 MB
|=====         |  37%   72 MB
|=====         |  37%   72 MB
|=====         |  37%   72 MB
|=====         |  37%   72 MB
|=====         |  37%   72 MB
|=====         |  38%   72 MB
|=====         |  38%   72 MB
|=====         |  38%   72 MB
|=====         |  38%   73 MB
|=====         |  38%   73 MB
|=====         |  38%   73 MB
|=====         |  38%   73 MB
|=====         |  38%   73 MB
|=====         |  38%   73 MB
|=====         |  38%   73 MB
|=====         |  38%   73 MB
|=====         |  38%   74 MB
|=====         |  38%   74 MB
|=====         |  38%   74 MB
|=====         |  38%   74 MB
|=====         |  38%   74 MB
|=====         |  39%   74 MB
|=====         |  39%   74 MB
|=====         |  39%   74 MB
|=====         |  39%   74 MB
|=====         |  39%   75 MB
|=====         |  39%   75 MB
|=====         |  39%   75 MB
|=====         |  39%   75 MB
|=====         |  39%   75 MB
|=====         |  39%   75 MB
|=====         |  39%   75 MB
|=====         |  39%   75 MB
|=====         |  39%   76 MB
|=====         |  39%   76 MB
|=====         |  39%   76 MB
|=====         |  39%   76 MB
|======        |  40%   76 MB
|======        |  40%   76 MB
|======        |  40%   76 MB
|======        |  40%   76 MB
|======        |  40%   77 MB
|======        |  40%   77 MB
|======        |  40%   77 MB
|======        |  40%   77 MB
|======        |  40%   77 MB
|======        |  40%   77 MB
|======        |  40%   77 MB
|======        |  40%   77 MB
|======        |  40%   77 MB
|======        |  40%   78 MB
|======        |  40%   78 MB
|======        |  40%   78 MB
|======        |  41%   78 MB
|======        |  41%   78 MB
|======        |  41%   78 MB
|======        |  41%   78 MB
|======        |  41%   78 MB
|======        |  41%   79 MB
|======        |  41%   79 MB
|======        |  41%   79 MB
|======        |  41%   79 MB
|======        |  41%   79 MB
|======        |  41%   79 MB
|======        |  41%   79 MB
|======        |  41%   79 MB
|======        |  41%   80 MB
|======        |  41%   80 MB
|======        |  41%   80 MB
|======        |  42%   80 MB
|======        |  42%   80 MB
|======        |  42%   80 MB
|======        |  42%   80 MB
|======        |  42%   80 MB
|======        |  42%   80 MB
|======        |  42%   81 MB
|======        |  42%   81 MB
|======        |  42%   81 MB
|======        |  42%   81 MB
|======        |  42%   81 MB
|======        |  42%   81 MB
|======        |  42%   81 MB
|======        |  42%   81 MB
|======        |  42%   82 MB
|======        |  42%   82 MB
|======        |  43%   82 MB
|======        |  43%   82 MB
|======        |  43%   82 MB
|======        |  43%   82 MB
|======        |  43%   82 MB
|======        |  43%   82 MB
|======        |  43%   82 MB
|======        |  43%   83 MB
|======        |  43%   83 MB
|======        |  43%   83 MB
|======        |  43%   83 MB
|======        |  43%   83 MB
|======        |  43%   83 MB
|======        |  43%   83 MB
|======        |  43%   83 MB
|======        |  43%   84 MB
|======        |  44%   84 MB
|======        |  44%   84 MB
|======        |  44%   84 MB
|======        |  44%   84 MB
|======        |  44%   84 MB
|======        |  44%   84 MB
|======        |  44%   84 MB
|======        |  44%   85 MB
|======        |  44%   85 MB
|======        |  44%   85 MB
|======        |  44%   85 MB
|======        |  44%   85 MB
|======        |  44%   85 MB
|======        |  44%   85 MB
|======        |  44%   85 MB
|======        |  44%   85 MB
|======        |  44%   86 MB
|======        |  45%   86 MB
|======        |  45%   86 MB
|======        |  45%   86 MB
|======        |  45%   86 MB
|======        |  45%   86 MB
|======        |  45%   86 MB
|======        |  45%   86 MB
|======        |  45%   87 MB
|======        |  45%   87 MB
|======        |  45%   87 MB
|======        |  45%   87 MB
|======        |  45%   87 MB
|======        |  45%   87 MB
|======        |  45%   87 MB
|======        |  45%   87 MB
|======        |  45%   87 MB
|======        |  46%   88 MB
|======        |  46%   88 MB
|======        |  46%   88 MB
|======        |  46%   88 MB
|======        |  46%   88 MB
|======        |  46%   88 MB
|======        |  46%   88 MB
|======        |  46%   88 MB
|======        |  46%   89 MB
|======        |  46%   89 MB
|=======       |  46%   89 MB
|=======       |  46%   89 MB
|=======       |  46%   89 MB
|=======       |  46%   89 MB
|=======       |  46%   89 MB
|=======       |  46%   89 MB
|=======       |  47%   90 MB
|=======       |  47%   90 MB
|=======       |  47%   90 MB
|=======       |  47%   90 MB
|=======       |  47%   90 MB
|=======       |  47%   90 MB
|=======       |  47%   90 MB
|=======       |  47%   90 MB
|=======       |  47%   90 MB
|=======       |  47%   91 MB
|=======       |  47%   91 MB
|=======       |  47%   91 MB
|=======       |  47%   91 MB
|=======       |  47%   91 MB
|=======       |  47%   91 MB
|=======       |  47%   91 MB
|=======       |  48%   91 MB
|=======       |  48%   92 MB
|=======       |  48%   92 MB
|=======       |  48%   92 MB
|=======       |  48%   92 MB
|=======       |  48%   92 MB
|=======       |  48%   92 MB
|=======       |  48%   92 MB
|=======       |  48%   92 MB
|=======       |  48%   92 MB
|=======       |  48%   93 MB
|=======       |  48%   93 MB
|=======       |  48%   93 MB
|=======       |  48%   93 MB
|=======       |  48%   93 MB
|=======       |  48%   93 MB
|=======       |  49%   93 MB
|=======       |  49%   93 MB
|=======       |  49%   94 MB
|=======       |  49%   94 MB
|=======       |  49%   94 MB
|=======       |  49%   94 MB
|=======       |  49%   94 MB
|=======       |  49%   94 MB
|=======       |  49%   94 MB
|=======       |  49%   94 MB
|=======       |  49%   95 MB
|=======       |  49%   95 MB
|=======       |  49%   95 MB
|=======       |  49%   95 MB
|=======       |  49%   95 MB
|=======       |  49%   95 MB
|=======       |  50%   95 MB
|=======       |  50%   95 MB
|=======       |  50%   95 MB
|=======       |  50%   96 MB
|=======       |  50%   96 MB
|=======       |  50%   96 MB
|=======       |  50%   96 MB
|=======       |  50%   96 MB
|=======       |  50%   96 MB
|=======       |  50%   96 MB
|=======       |  50%   96 MB
|=======       |  50%   97 MB
|=======       |  50%   97 MB
|=======       |  50%   97 MB
|=======       |  50%   97 MB
|=======       |  50%   97 MB
|=======       |  51%   97 MB
|=======       |  51%   97 MB
|=======       |  51%   97 MB
|=======       |  51%   98 MB
|=======       |  51%   98 MB
|=======       |  51%   98 MB
|=======       |  51%   98 MB
|=======       |  51%   98 MB
|=======       |  51%   98 MB
|=======       |  51%   98 MB
|=======       |  51%   98 MB
|=======       |  51%   98 MB
|=======       |  51%   99 MB
|=======       |  51%   99 MB
|=======       |  51%   99 MB
|=======       |  51%   99 MB
|=======       |  52%   99 MB
|=======       |  52%   99 MB
|=======       |  52%   99 MB
|=======       |  52%   99 MB
|=======       |  52%  100 MB
|=======       |  52%  100 MB
|=======       |  52%  100 MB
|=======       |  52%  100 MB
|=======       |  52%  100 MB
|=======       |  52%  100 MB
|=======       |  52%  100 MB
|=======       |  52%  100 MB
|=======       |  52%  100 MB
|=======       |  52%  101 MB
|=======       |  52%  101 MB
|=======       |  52%  101 MB
|=======       |  53%  101 MB
|=======       |  53%  101 MB
|=======       |  53%  101 MB
|=======       |  53%  101 MB
|=======       |  53%  101 MB
|========      |  53%  102 MB
|========      |  53%  102 MB
|========      |  53%  102 MB
|========      |  53%  102 MB
|========      |  53%  102 MB
|========      |  53%  102 MB
|========      |  53%  102 MB
|========      |  53%  102 MB
|========      |  53%  103 MB
|========      |  53%  103 MB
|========      |  53%  103 MB
|========      |  54%  103 MB
|========      |  54%  103 MB
|========      |  54%  103 MB
|========      |  54%  103 MB
|========      |  54%  103 MB
|========      |  54%  103 MB
|========      |  54%  104 MB
|========      |  54%  104 MB
|========      |  54%  104 MB
|========      |  54%  104 MB
|========      |  54%  104 MB
|========      |  54%  104 MB
|========      |  54%  104 MB
|========      |  54%  104 MB
|========      |  54%  105 MB
|========      |  54%  105 MB
|========      |  55%  105 MB
|========      |  55%  105 MB
|========      |  55%  105 MB
|========      |  55%  105 MB
|========      |  55%  105 MB
|========      |  55%  105 MB
|========      |  55%  105 MB
|========      |  55%  106 MB
|========      |  55%  106 MB
|========      |  55%  106 MB
|========      |  55%  106 MB
|========      |  55%  106 MB
|========      |  55%  106 MB
|========      |  55%  106 MB
|========      |  55%  106 MB
|========      |  55%  107 MB
|========      |  56%  107 MB
|========      |  56%  107 MB
|========      |  56%  107 MB
|========      |  56%  107 MB
|========      |  56%  107 MB
|========      |  56%  107 MB
|========      |  56%  107 MB
|========      |  56%  108 MB
|========      |  56%  108 MB
|========      |  56%  108 MB
|========      |  56%  108 MB
|========      |  56%  108 MB
|========      |  56%  108 MB
|========      |  56%  108 MB
|========      |  56%  108 MB
|========      |  56%  108 MB
|========      |  57%  109 MB
|========      |  57%  109 MB
|========      |  57%  109 MB
|========      |  57%  109 MB
|========      |  57%  109 MB
|========      |  57%  109 MB
|========      |  57%  109 MB
|========      |  57%  109 MB
|========      |  57%  110 MB
|========      |  57%  110 MB
|========      |  57%  110 MB
|========      |  57%  110 MB
|========      |  57%  110 MB
|========      |  57%  110 MB
|========      |  57%  110 MB
|========      |  57%  110 MB
|========      |  58%  110 MB
|========      |  58%  111 MB
|========      |  58%  111 MB
|========      |  58%  111 MB
|========      |  58%  111 MB
|========      |  58%  111 MB
|========      |  58%  111 MB
|========      |  58%  111 MB
|========      |  58%  111 MB
|========      |  58%  112 MB
|========      |  58%  112 MB
|========      |  58%  112 MB
|========      |  58%  112 MB
|========      |  58%  112 MB
|========      |  58%  112 MB
|========      |  58%  112 MB
|========      |  59%  112 MB
|========      |  59%  113 MB
|========      |  59%  113 MB
|========      |  59%  113 MB
|========      |  59%  113 MB
|========      |  59%  113 MB
|========      |  59%  113 MB
|========      |  59%  113 MB
|========      |  59%  113 MB
|========      |  59%  113 MB
|========      |  59%  114 MB
|========      |  59%  114 MB
|========      |  59%  114 MB
|========      |  59%  114 MB
|========      |  59%  114 MB
|========      |  59%  114 MB
|=========     |  60%  114 MB
|=========     |  60%  114 MB
|=========     |  60%  115 MB
|=========     |  60%  115 MB
|=========     |  60%  115 MB
|=========     |  60%  115 MB
|=========     |  60%  115 MB
|=========     |  60%  115 MB
|=========     |  60%  115 MB
|=========     |  60%  115 MB
|=========     |  60%  116 MB
|=========     |  60%  116 MB
|=========     |  60%  116 MB
|=========     |  60%  116 MB
|=========     |  60%  116 MB
|=========     |  60%  116 MB
|=========     |  61%  116 MB
|=========     |  61%  116 MB
|=========     |  61%  116 MB
|=========     |  61%  117 MB
|=========     |  61%  117 MB
|=========     |  61%  117 MB
|=========     |  61%  117 MB
|=========     |  61%  117 MB
|=========     |  61%  117 MB
|=========     |  61%  117 MB
|=========     |  61%  117 MB
|=========     |  61%  118 MB
|=========     |  61%  118 MB
|=========     |  61%  118 MB
|=========     |  61%  118 MB
|=========     |  61%  118 MB
|=========     |  62%  118 MB
|=========     |  62%  118 MB
|=========     |  62%  118 MB
|=========     |  62%  118 MB
|=========     |  62%  119 MB
|=========     |  62%  119 MB
|=========     |  62%  119 MB
|=========     |  62%  119 MB
|=========     |  62%  119 MB
|=========     |  62%  119 MB
|=========     |  62%  119 MB
|=========     |  62%  119 MB
|=========     |  62%  120 MB
|=========     |  62%  120 MB
|=========     |  62%  120 MB
|=========     |  62%  120 MB
|=========     |  63%  120 MB
|=========     |  63%  120 MB
|=========     |  63%  120 MB
|=========     |  63%  120 MB
|=========     |  63%  121 MB
|=========     |  63%  121 MB
|=========     |  63%  121 MB
|=========     |  63%  121 MB
|=========     |  63%  121 MB
|=========     |  63%  121 MB
|=========     |  63%  121 MB
|=========     |  63%  121 MB
|=========     |  63%  121 MB
|=========     |  63%  122 MB
|=========     |  63%  122 MB
|=========     |  63%  122 MB
|=========     |  64%  122 MB
|=========     |  64%  122 MB
|=========     |  64%  122 MB
|=========     |  64%  122 MB
|=========     |  64%  122 MB
|=========     |  64%  123 MB
|=========     |  64%  123 MB
|=========     |  64%  123 MB
|=========     |  64%  123 MB
|=========     |  64%  123 MB
|=========     |  64%  123 MB
|=========     |  64%  123 MB
|=========     |  64%  123 MB
|=========     |  64%  123 MB
|=========     |  64%  124 MB
|=========     |  64%  124 MB
|=========     |  65%  124 MB
|=========     |  65%  124 MB
|=========     |  65%  124 MB
|=========     |  65%  124 MB
|=========     |  65%  124 MB
|=========     |  65%  124 MB
|=========     |  65%  125 MB
|=========     |  65%  125 MB
|=========     |  65%  125 MB
|=========     |  65%  125 MB
|=========     |  65%  125 MB
|=========     |  65%  125 MB
|=========     |  65%  125 MB
|=========     |  65%  125 MB
|=========     |  65%  126 MB
|=========     |  65%  126 MB
|=========     |  66%  126 MB
|=========     |  66%  126 MB
|=========     |  66%  126 MB
|=========     |  66%  126 MB
|=========     |  66%  126 MB
|=========     |  66%  126 MB
|=========     |  66%  126 MB
|=========     |  66%  127 MB
|=========     |  66%  127 MB
|=========     |  66%  127 MB
|=========     |  66%  127 MB
|==========    |  66%  127 MB
|==========    |  66%  127 MB
|==========    |  66%  127 MB
|==========    |  66%  127 MB
|==========    |  66%  128 MB
|==========    |  66%  128 MB
|==========    |  67%  128 MB
|==========    |  67%  128 MB
|==========    |  67%  128 MB
|==========    |  67%  128 MB
|==========    |  67%  128 MB
|==========    |  67%  128 MB
|==========    |  67%  129 MB
|==========    |  67%  129 MB
|==========    |  67%  129 MB
|==========    |  67%  129 MB
|==========    |  67%  129 MB
|==========    |  67%  129 MB
|==========    |  67%  129 MB
|==========    |  67%  129 MB
|==========    |  67%  129 MB
|==========    |  67%  130 MB
|==========    |  68%  130 MB
|==========    |  68%  130 MB
|==========    |  68%  130 MB
|==========    |  68%  130 MB
|==========    |  68%  130 MB
|==========    |  68%  130 MB
|==========    |  68%  130 MB
|==========    |  68%  131 MB
|==========    |  68%  131 MB
|==========    |  68%  131 MB
|==========    |  68%  131 MB
|==========    |  68%  131 MB
|==========    |  68%  131 MB
|==========    |  68%  131 MB
|==========    |  68%  131 MB
|==========    |  68%  131 MB
|==========    |  69%  132 MB
|==========    |  69%  132 MB
|==========    |  69%  132 MB
|==========    |  69%  132 MB
|==========    |  69%  132 MB
|==========    |  69%  132 MB
|==========    |  69%  132 MB
|==========    |  69%  132 MB
|==========    |  69%  133 MB
|==========    |  69%  133 MB
|==========    |  69%  133 MB
|==========    |  69%  133 MB
|==========    |  69%  133 MB
|==========    |  69%  133 MB
|==========    |  69%  133 MB
|==========    |  69%  133 MB
|==========    |  70%  134 MB
|==========    |  70%  134 MB
|==========    |  70%  134 MB
|==========    |  70%  134 MB
|==========    |  70%  134 MB
|==========    |  70%  134 MB
|==========    |  70%  134 MB
|==========    |  70%  134 MB
|==========    |  70%  134 MB
|==========    |  70%  135 MB
|==========    |  70%  135 MB
|==========    |  70%  135 MB
|==========    |  70%  135 MB
|==========    |  70%  135 MB
|==========    |  70%  135 MB
|==========    |  70%  135 MB
|==========    |  71%  135 MB
|==========    |  71%  136 MB
|==========    |  71%  136 MB
|==========    |  71%  136 MB
|==========    |  71%  136 MB
|==========    |  71%  136 MB
|==========    |  71%  136 MB
|==========    |  71%  136 MB
|==========    |  71%  136 MB
|==========    |  71%  136 MB
|==========    |  71%  137 MB
|==========    |  71%  137 MB
|==========    |  71%  137 MB
|==========    |  71%  137 MB
|==========    |  71%  137 MB
|==========    |  71%  137 MB
|==========    |  72%  137 MB
|==========    |  72%  137 MB
|==========    |  72%  138 MB
|==========    |  72%  138 MB
|==========    |  72%  138 MB
|==========    |  72%  138 MB
|==========    |  72%  138 MB
|==========    |  72%  138 MB
|==========    |  72%  138 MB
|==========    |  72%  138 MB
|==========    |  72%  139 MB
|==========    |  72%  139 MB
|==========    |  72%  139 MB
|==========    |  72%  139 MB
|==========    |  72%  139 MB
|==========    |  72%  139 MB
|==========    |  73%  139 MB
|==========    |  73%  139 MB
|==========    |  73%  139 MB
|==========    |  73%  140 MB
|==========    |  73%  140 MB
|===========   |  73%  140 MB
|===========   |  73%  140 MB
|===========   |  73%  140 MB
|===========   |  73%  140 MB
|===========   |  73%  140 MB
|===========   |  73%  140 MB
|===========   |  73%  141 MB
|===========   |  73%  141 MB
|===========   |  73%  141 MB
|===========   |  73%  141 MB
|===========   |  73%  141 MB
|===========   |  74%  141 MB
|===========   |  74%  141 MB
|===========   |  74%  141 MB
|===========   |  74%  141 MB
|===========   |  74%  142 MB
|===========   |  74%  142 MB
|===========   |  74%  142 MB
|===========   |  74%  142 MB
|===========   |  74%  142 MB
|===========   |  74%  142 MB
|===========   |  74%  142 MB
|===========   |  74%  142 MB
|===========   |  74%  143 MB
|===========   |  74%  143 MB
|===========   |  74%  143 MB
|===========   |  74%  143 MB
|===========   |  75%  143 MB
|===========   |  75%  143 MB
|===========   |  75%  143 MB
|===========   |  75%  143 MB
|===========   |  75%  144 MB
|===========   |  75%  144 MB
|===========   |  75%  144 MB
|===========   |  75%  144 MB
|===========   |  75%  144 MB
|===========   |  75%  144 MB
|===========   |  75%  144 MB
|===========   |  75%  144 MB
|===========   |  75%  144 MB
|===========   |  75%  145 MB
|===========   |  75%  145 MB
|===========   |  75%  145 MB
|===========   |  76%  145 MB
|===========   |  76%  145 MB
|===========   |  76%  145 MB
|===========   |  76%  145 MB
|===========   |  76%  145 MB
|===========   |  76%  146 MB
|===========   |  76%  146 MB
|===========   |  76%  146 MB
|===========   |  76%  146 MB
|===========   |  76%  146 MB
|===========   |  76%  146 MB
|===========   |  76%  146 MB
|===========   |  76%  146 MB
|===========   |  76%  147 MB
|===========   |  76%  147 MB
|===========   |  76%  147 MB
|===========   |  77%  147 MB
|===========   |  77%  147 MB
|===========   |  77%  147 MB
|===========   |  77%  147 MB
|===========   |  77%  147 MB
|===========   |  77%  147 MB
|===========   |  77%  148 MB
|===========   |  77%  148 MB
|===========   |  77%  148 MB
|===========   |  77%  148 MB
|===========   |  77%  148 MB
|===========   |  77%  148 MB
|===========   |  77%  148 MB
|===========   |  77%  148 MB
|===========   |  77%  149 MB
|===========   |  77%  149 MB
|===========   |  78%  149 MB
|===========   |  78%  149 MB
|===========   |  78%  149 MB
|===========   |  78%  149 MB
|===========   |  78%  149 MB
|===========   |  78%  149 MB
|===========   |  78%  149 MB
|===========   |  78%  150 MB
|===========   |  78%  150 MB
|===========   |  78%  150 MB
|===========   |  78%  150 MB
|===========   |  78%  150 MB
|===========   |  78%  150 MB
|===========   |  78%  150 MB
|===========   |  78%  150 MB
|===========   |  78%  151 MB
|===========   |  79%  151 MB
|===========   |  79%  151 MB
|===========   |  79%  151 MB
|===========   |  79%  151 MB
|===========   |  79%  151 MB
|===========   |  79%  151 MB
|===========   |  79%  151 MB
|===========   |  79%  152 MB
|===========   |  79%  152 MB
|===========   |  79%  152 MB
|===========   |  79%  152 MB
|===========   |  79%  152 MB
|===========   |  79%  152 MB
|===========   |  79%  152 MB
|===========   |  79%  152 MB
|===========   |  79%  152 MB
|============  |  80%  153 MB
|============  |  80%  153 MB
|============  |  80%  153 MB
|============  |  80%  153 MB
|============  |  80%  153 MB
|============  |  80%  153 MB
|============  |  80%  153 MB
|============  |  80%  153 MB
|============  |  80%  154 MB
|============  |  80%  154 MB
|============  |  80%  154 MB
|============  |  80%  154 MB
|============  |  80%  154 MB
|============  |  80%  154 MB
|============  |  80%  154 MB
|============  |  80%  154 MB
|============  |  81%  154 MB
|============  |  81%  155 MB
|============  |  81%  155 MB
|============  |  81%  155 MB
|============  |  81%  155 MB
|============  |  81%  155 MB
|============  |  81%  155 MB
|============  |  81%  155 MB
|============  |  81%  155 MB
|============  |  81%  156 MB
|============  |  81%  156 MB
|============  |  81%  156 MB
|============  |  81%  156 MB
|============  |  81%  156 MB
|============  |  81%  156 MB
|============  |  81%  156 MB
|============  |  82%  156 MB
|============  |  82%  157 MB
|============  |  82%  157 MB
|============  |  82%  157 MB
|============  |  82%  157 MB
|============  |  82%  157 MB
|============  |  82%  157 MB
|============  |  82%  157 MB
|============  |  82%  157 MB
|============  |  82%  157 MB
|============  |  82%  158 MB
|============  |  82%  158 MB
|============  |  82%  158 MB
|============  |  82%  158 MB
|============  |  82%  158 MB
|============  |  82%  158 MB
|============  |  83%  158 MB
|============  |  83%  158 MB
|============  |  83%  159 MB
|============  |  83%  159 MB
|============  |  83%  159 MB
|============  |  83%  159 MB
|============  |  83%  159 MB
|============  |  83%  159 MB
|============  |  83%  159 MB
|============  |  83%  159 MB
|============  |  83%  159 MB
|============  |  83%  160 MB
|============  |  83%  160 MB
|============  |  83%  160 MB
|============  |  83%  160 MB
|============  |  83%  160 MB
|============  |  84%  160 MB
|============  |  84%  160 MB
|============  |  84%  160 MB
|============  |  84%  161 MB
|============  |  84%  161 MB
|============  |  84%  161 MB
|============  |  84%  161 MB
|============  |  84%  161 MB
|============  |  84%  161 MB
|============  |  84%  161 MB
|============  |  84%  161 MB
|============  |  84%  162 MB
|============  |  84%  162 MB
|============  |  84%  162 MB
|============  |  84%  162 MB
|============  |  84%  162 MB
|============  |  85%  162 MB
|============  |  85%  162 MB
|============  |  85%  162 MB
|============  |  85%  162 MB
|============  |  85%  163 MB
|============  |  85%  163 MB
|============  |  85%  163 MB
|============  |  85%  163 MB
|============  |  85%  163 MB
|============  |  85%  163 MB
|============  |  85%  163 MB
|============  |  85%  163 MB
|============  |  85%  164 MB
|============  |  85%  164 MB
|============  |  85%  164 MB
|============  |  85%  164 MB
|============  |  86%  164 MB
|============  |  86%  164 MB
|============  |  86%  164 MB
|============  |  86%  164 MB
|============  |  86%  165 MB
|============  |  86%  165 MB
|============  |  86%  165 MB
|============  |  86%  165 MB
|============  |  86%  165 MB
|============  |  86%  165 MB
|============  |  86%  165 MB
|============= |  86%  165 MB
|============= |  86%  165 MB
|============= |  86%  166 MB
|============= |  86%  166 MB
|============= |  86%  166 MB
|============= |  87%  166 MB
|============= |  87%  166 MB
|============= |  87%  166 MB
|============= |  87%  166 MB
|============= |  87%  166 MB
|============= |  87%  167 MB
|============= |  87%  167 MB
|============= |  87%  167 MB
|============= |  87%  167 MB
|============= |  87%  167 MB
|============= |  87%  167 MB
|============= |  87%  167 MB
|============= |  87%  167 MB
|============= |  87%  167 MB
|============= |  87%  168 MB
|============= |  87%  168 MB
|============= |  88%  168 MB
|============= |  88%  168 MB
|============= |  88%  168 MB
|============= |  88%  168 MB
|============= |  88%  168 MB
|============= |  88%  168 MB
|============= |  88%  169 MB
|============= |  88%  169 MB
|============= |  88%  169 MB
|============= |  88%  169 MB
|============= |  88%  169 MB
|============= |  88%  169 MB
|============= |  88%  169 MB
|============= |  88%  169 MB
|============= |  88%  170 MB
|============= |  88%  170 MB
|============= |  88%  170 MB
|============= |  89%  170 MB
|============= |  89%  170 MB
|============= |  89%  170 MB
|============= |  89%  170 MB
|============= |  89%  170 MB
|============= |  89%  170 MB
|============= |  89%  171 MB
|============= |  89%  171 MB
|============= |  89%  171 MB
|============= |  89%  171 MB
|============= |  89%  171 MB
|============= |  89%  171 MB
|============= |  89%  171 MB
|============= |  89%  171 MB
|============= |  89%  172 MB
|============= |  89%  172 MB
|============= |  90%  172 MB
|============= |  90%  172 MB
|============= |  90%  172 MB
|============= |  90%  172 MB
|============= |  90%  172 MB
|============= |  90%  172 MB
|============= |  90%  172 MB
|============= |  90%  173 MB
|============= |  90%  173 MB
|============= |  90%  173 MB
|============= |  90%  173 MB
|============= |  90%  173 MB
|============= |  90%  173 MB
|============= |  90%  173 MB
|============= |  90%  173 MB
|============= |  90%  174 MB
|============= |  91%  174 MB
|============= |  91%  174 MB
|============= |  91%  174 MB
|============= |  91%  174 MB
|============= |  91%  174 MB
|============= |  91%  174 MB
|============= |  91%  174 MB
|============= |  91%  175 MB
|============= |  91%  175 MB
|============= |  91%  175 MB
|============= |  91%  175 MB
|============= |  91%  175 MB
|============= |  91%  175 MB
|============= |  91%  175 MB
|============= |  91%  175 MB
|============= |  91%  175 MB
|============= |  92%  176 MB
|============= |  92%  176 MB
|============= |  92%  176 MB
|============= |  92%  176 MB
|============= |  92%  176 MB
|============= |  92%  176 MB
|============= |  92%  176 MB
|============= |  92%  176 MB
|============= |  92%  177 MB
|============= |  92%  177 MB
|============= |  92%  177 MB
|============= |  92%  177 MB
|============= |  92%  177 MB
|============= |  92%  177 MB
|============= |  92%  177 MB
|============= |  92%  177 MB
|============= |  93%  178 MB
|============= |  93%  178 MB
|============= |  93%  178 MB
|============= |  93%  178 MB
|============= |  93%  178 MB
|==============|  93%  178 MB
|==============|  93%  178 MB
|==============|  93%  178 MB
|==============|  93%  178 MB
|==============|  93%  179 MB
|==============|  93%  179 MB
|==============|  93%  179 MB
|==============|  93%  179 MB
|==============|  93%  179 MB
|==============|  93%  179 MB
|==============|  93%  179 MB
|==============|  94%  179 MB
|==============|  94%  180 MB
|==============|  94%  180 MB
|==============|  94%  180 MB
|==============|  94%  180 MB
|==============|  94%  180 MB
|==============|  94%  180 MB
|==============|  94%  180 MB
|==============|  94%  180 MB
|==============|  94%  180 MB
|==============|  94%  181 MB
|==============|  94%  181 MB
|==============|  94%  181 MB
|==============|  94%  181 MB
|==============|  94%  181 MB
|==============|  94%  181 MB
|==============|  95%  181 MB
|==============|  95%  181 MB
|==============|  95%  182 MB
|==============|  95%  182 MB
|==============|  95%  182 MB
|==============|  95%  182 MB
|==============|  95%  182 MB
|==============|  95%  182 MB
|==============|  95%  182 MB
|==============|  95%  182 MB
|==============|  95%  183 MB
|==============|  95%  183 MB
|==============|  95%  183 MB
|==============|  95%  183 MB
|==============|  95%  183 MB
|==============|  95%  183 MB
|==============|  96%  183 MB
|==============|  96%  183 MB
|==============|  96%  183 MB
|==============|  96%  184 MB
|==============|  96%  184 MB
|==============|  96%  184 MB
|==============|  96%  184 MB
|==============|  96%  184 MB
|==============|  96%  184 MB
|==============|  96%  184 MB
|==============|  96%  184 MB
|==============|  96%  185 MB
|==============|  96%  185 MB
|==============|  96%  185 MB
|==============|  96%  185 MB
|==============|  96%  185 MB
|==============|  97%  185 MB
|==============|  97%  185 MB
|==============|  97%  185 MB
|==============|  97%  185 MB
|==============|  97%  186 MB
|==============|  97%  186 MB
|==============|  97%  186 MB
|==============|  97%  186 MB
|==============|  97%  186 MB
|==============|  97%  186 MB
|==============|  97%  186 MB
|==============|  97%  186 MB
|==============|  97%  187 MB
|==============|  97%  187 MB
|==============|  97%  187 MB
|==============|  97%  187 MB
|==============|  98%  187 MB
|==============|  98%  187 MB
|==============|  98%  187 MB
|==============|  98%  187 MB
|==============|  98%  188 MB
|==============|  98%  188 MB
|==============|  98%  188 MB
|==============|  98%  188 MB
|==============|  98%  188 MB
|==============|  98%  188 MB
|==============|  98%  188 MB
|==============|  98%  188 MB
|==============|  98%  188 MB
|==============|  98%  189 MB
|==============|  98%  189 MB
|==============|  98%  189 MB
|==============|  99%  189 MB
|==============|  99%  189 MB
|==============|  99%  189 MB
|==============|  99%  189 MB
|==============|  99%  189 MB
|==============|  99%  190 MB
|==============|  99%  190 MB
|==============|  99%  190 MB
|==============|  99%  190 MB
|==============|  99%  190 MB
|==============|  99%  190 MB
|==============|  99%  190 MB
|==============|  99%  190 MB
|==============|  99%  190 MB
|==============|  99%  191 MB
|==============|  99%  191 MB
|===============| 100%  191 MB
test = read_csv("./data/test.csv")
Parsed with column specification:
cols(
  id = col_character(),
  vendor_id = col_integer(),
  pickup_datetime = col_datetime(format = ""),
  passenger_count = col_integer(),
  pickup_longitude = col_double(),
  pickup_latitude = col_double(),
  dropoff_longitude = col_double(),
  dropoff_latitude = col_double(),
  store_and_fwd_flag = col_character()
)
sum(is.na(train))
[1] 0
sum(is.na(test))
[1] 0
ggplot(data=train, aes(x= trip_duration)) + 
  geom_histogram(bins = 100) +
  scale_x_log10(limits = c(NA,100000)) +
  scale_y_log10() +
  theme_bw() +
  theme(axis.title = element_text(size=16),
        axis.text = element_text(size=14)) +
  labs(x = 'Trip Duration', y = 'Count', title = 'Trip Duration') 

nycData = subset(train,train$trip_duration < (60*60*24) )
ggplot(nycData,aes(x=factor(passenger_count),y=trip_duration))+geom_boxplot()+scale_y_log10()

ggplot(data=nycData, aes(x= pickup_longitude)) + 
  geom_histogram(bins = 100) +
  scale_x_continuous(limits = c(-74,-73.85)) +
  theme_bw() +
  theme(axis.title = element_text(size=16),
        axis.text = element_text(size=14)) +
  labs(x = 'Longitude', y = 'Count', title = 'Longitude')
Warning message:
In strsplit(content, "\n", fixed = TRUE) : input string 1 is invalid UTF-8

ggplot(data=nycData, aes(x= pickup_latitude)) + 
  geom_histogram(bins = 100) +
  scale_x_continuous(limits = c(40.6,40.85)) +
  theme_bw() +
  theme(axis.title = element_text(size=16),
        axis.text = element_text(size=14)) +
  labs(x = 'Latitude', y = 'Count', title = 'Latitude')

pick_coord <- nycData %>%
  select(pickup_longitude, pickup_latitude)
drop_coord <- nycData %>%
  select(dropoff_longitude, dropoff_latitude)
nycData$dist <- distCosine(pick_coord, drop_coord) 
nycData$haversine <- distHaversine(pick_coord, drop_coord)
nycData$bearing <- bearing(pick_coord, drop_coord) 
ggplot(data=nycData, aes(x= haversine)) + 
  geom_histogram() +
  scale_x_log10() +
  scale_y_log10() +
  theme_bw() +
  theme(axis.title = element_text(size=16),
        axis.text = element_text(size=14)) +
  labs(x = 'Distance', y = 'Count', title = 'Distance')

ggplot(nycData)+
  geom_point(aes(x=haversine,y=trip_duration))+
  scale_y_log10() +
  scale_x_log10() +
  theme_bw()+
  theme(axis.title = element_text(size=16),axis.text = element_text(size=14))+
  xlab("(Distance)")+
  ylab("Duration")

COMBINING TRAIN AND TEST

train <- as.tibble(train)
test <- as.tibble(test)
combine = bind_rows(train %>% mutate(dset="train"),
                    test %>% mutate(dset="test",
                                    dropoff_datetime=NA,
                                    trip_duration=NA))
combine <- combine %>% mutate(dset = factor(dset))
train = train %>%
  mutate(pickup_datetime = ymd_hms(pickup_datetime),
         dropoff_datetime = ymd_hms(dropoff_datetime),
         vendor_id = factor(vendor_id),
         passenger_count = factor(passenger_count))

INDIVISUAL FEATURE VISUALIZATION

각 변수의 분포를 우선 살펴본다

pickup/dropoff coordinates

set.seed(1234)
foo <- sample_n(train, 8e3)
leaflet(data = foo) %>% addProviderTiles("Esri.NatGeoWorldMap") %>%
  addCircleMarkers(~ pickup_longitude, ~pickup_latitude, radius = 1,
                   color = "blue", fillOpacity = 0.3)

leaflet(data = foo) %>% addProviderTiles("Esri.NatGeoWorldMap") %>%
  addCircleMarkers(~ dropoff_longitude, ~dropoff_latitude, radius = 1,
                   color = "blue", fillOpacity = 0.3)

trip_duration

train %>%
  ggplot(aes(trip_duration)) +
  geom_histogram(fill = "red", bins = 150) + 
  scale_x_log10() +
  scale_y_sqrt()

# View(train)
p1 <- train %>%
  ggplot(aes(pickup_datetime)) +
  geom_histogram(fill = "red", bins = 120) +
  labs(x = "Pickup dates")
p2 <- train %>%
  ggplot(aes(dropoff_datetime)) +
  geom_histogram(fill = "blue", bins = 120) +
  labs(x = "Dropoff dates")
layout <- matrix(c(1,2),2,1,byrow=FALSE)
multiplot(p1, p2, layout=layout)

p1 <- train %>%
  group_by(passenger_count) %>%
  count() %>%
  ggplot(aes(passenger_count, n, fill = passenger_count)) +
  geom_col() +
  scale_y_sqrt() +
  theme(legend.position = "none")
p2 <- train %>%
  ggplot(aes(vendor_id, fill = vendor_id)) +
  geom_bar() +
  theme(legend.position = "none")
p3 <- train %>%
  ggplot(aes(store_and_fwd_flag)) +
  geom_bar() +
  theme(legend.position = "none") +
  scale_y_log10()
p4 <- train %>%
  mutate(wday = wday(pickup_datetime, label = TRUE)) %>%
  group_by(wday, vendor_id) %>%
  count() %>%
  ggplot(aes(wday, n, colour = vendor_id)) +
  geom_point(size = 4) +
  labs(x = "Day of the week", y = "Total number of pickups") +
  theme(legend.position = "none")
p5 <- train %>%
  mutate(hpick = hour(pickup_datetime)) %>%
  group_by(hpick, vendor_id) %>%
  count() %>%
  ggplot(aes(hpick, n, color = vendor_id)) +
  geom_point(size = 4) +
  labs(x = "Hour of the day", y = "Total number of pickups") +
  theme(legend.position = "none")
layout <- matrix(c(1,2,3,4,5,5),3,2,byrow=TRUE)
multiplot(p1, p2, p3, p4, p5, layout=layout)

p1 <- train %>%
  mutate(hpick = hour(pickup_datetime),
         Month = factor(month(pickup_datetime, label = TRUE))) %>%
  group_by(hpick, Month) %>%
  count() %>%
  ggplot(aes(hpick, n, color = Month)) +
  geom_line(size = 1.5) +
  labs(x = "Hour of the day", y = "count")
p2 <- train %>%
  mutate(hpick = hour(pickup_datetime),
         wday = factor(wday(pickup_datetime, label = TRUE))) %>%
  group_by(hpick, wday) %>%
  count() %>%
  ggplot(aes(hpick, n, color = wday)) +
  geom_line(size = 1.5) +
  labs(x = "Hour of the day", y = "count")
layout <- matrix(c(1,2),2,1,byrow=FALSE)
multiplot(p1, p2, layout=layout)

FEATURE RELATIONS

Pickup date/time vs trip_duration

p1 <- train %>%
  mutate(wday = wday(pickup_datetime, label = TRUE)) %>%
  group_by(wday, vendor_id) %>%
  summarise(median_duration = median(trip_duration)/60) %>%
  ggplot(aes(wday, median_duration, color = vendor_id)) +
  geom_point(size = 4) +
  labs(x = "Day of the week", y = "Median trip duration [min]")
p2 <- train %>%
  mutate(hpick = hour(pickup_datetime)) %>%
  group_by(hpick, vendor_id) %>%
  summarise(median_duration = median(trip_duration)/60) %>%
  ggplot(aes(hpick, median_duration, color = vendor_id)) +
  geom_smooth(method = "loess", span = 1/2) +
  geom_point(size = 4) +
  labs(x = "Hour of the day", y = "Median trip duration [min]") +
  theme(legend.position = "none")
layout <- matrix(c(1,2),2,1,byrow=FALSE)
multiplot(p1, p2, layout=layout)

Passenger count and Vendor vs trip_duration

train %>%
  ggplot(aes(trip_duration, fill = vendor_id)) +
  geom_density(position = "stack") +
  scale_x_log10()

train %>%
  group_by(vendor_id) %>%
  summarise(mean_duration = mean(trip_duration),
            median_duration = median(trip_duration))

Feature Engineering

train = as.data.table(train)
train <- train[,distance_km := 
                     distHaversine(matrix(c(pickup_longitude, pickup_latitude), ncol = 2),
                     matrix(c(dropoff_longitude,dropoff_latitude), ncol = 2))/1000
              ]
train %>% 
  ggplot(aes(x=distance_km)) + 
  geom_histogram(bins=4000, fill="red")+
  theme_bw()+theme(axis.title = element_text(size=11),axis.text = element_text(size=8))+
  ylab("Density")+coord_cartesian(x=c(0,25))

train[,speed:=(distance_km)/(trip_duration/3600)]
train %>% 
  ggplot(aes(x=speed)) + 
  geom_histogram(bins=4000, fill="red")+
  theme_bw()+theme(axis.title = element_text(size=11),axis.text = element_text(size=8))+
  ylab("Density")+coord_cartesian(x=c(0,50))

summary(train$speed)
    Min.  1st Qu.   Median 
   0.000    9.131   12.810 
    Mean  3rd Qu.     Max. 
  14.440   17.860 9285.000 
train$pickup_hour <- hour(train$pickup_datetime)
train$pickup_week <- week(train$pickup_datetime)
train$pickup_month <- month(train$pickup_datetime)
train$pickup_weekdays <- weekdays(train$pickup_datetime)
train$pickup_weekend <- ifelse(train$pickup_weekdays==1 | train$pickup_weekdays==7,"Weekend","not-Weekend")
train[,pickup_datetime:=as.Date(pickup_datetime)]
train[,dropoff_datetime:=as.Date(dropoff_datetime)]
train[,":="(
   pickup_yday=yday(pickup_datetime)
  ,pickup_mday=mday(pickup_datetime)
)]
train %>% 
  group_by(pickup_hour) %>% 
  summarize(mean_speed = mean(speed),n()) %>% 
  ggplot(aes(x=pickup_hour,y=mean_speed))+
  geom_smooth(method = 'loess',color="grey10")+
  geom_point(color="red")+coord_cartesian(ylim=c(10,25))+theme_bw()

Feature Visualisation

library(corrplot)
corr_features = train[,.(pickup_hour, pickup_week, pickup_month,pickup_yday, pickup_mday,passenger_count,trip_duration,distance_km)]
corrplot(cor(corr_features, use='complete.obs'), type='lower')

plot1 <-train[, list(mean_trip_duration = mean(trip_duration)), by = pickup_weekdays] %>%
  ggplot(aes(x = pickup_weekdays, y = mean_trip_duration)) +
  geom_bar(stat = 'identity', fill = 'steelblue') +
  labs(x = 'Month', y = 'Mean Trip Duration', title = 'Mean Trip duration by weekdays')
grid.arrange(plot1)

plot1 <-train[, list(mean_trip_duration = mean(trip_duration)), by = pickup_hour] %>%
  ggplot(aes(x = as.factor(pickup_hour), y = mean_trip_duration)) +
  geom_bar(stat = 'identity', fill = 'steelblue') +
  labs(x = 'Hours', y = 'Mean Trip Duration', title = 'Mean Trip duration by hour of the day')
plot2 = train[,.N, by=pickup_hour] %>%
  ggplot(aes(x=pickup_hour, y=N)) + 
  geom_bar(stat='identity', fill='steelblue') + 
  labs(x='', y='Number of Rides', title='Total Rides Per Hour')
grid.arrange(plot1, plot2, ncol =2)

External Data

suppressMessages({
fastest_route_train = read_csv("./data/new-york-city-taxi-with-osrm/fastest_routes_train_part_1.csv")
})

|                      |   0%
|                      |   0%
|              |   0%    1 MB
|              |   0%    1 MB
|              |   0%    1 MB
|              |   0%    2 MB
|              |   0%    2 MB
|              |   1%    2 MB
|              |   1%    3 MB
|              |   1%    3 MB
|              |   1%    3 MB
|              |   1%    3 MB
|              |   1%    4 MB
|              |   1%    4 MB
|              |   1%    4 MB
|              |   2%    5 MB
|              |   2%    5 MB
|              |   2%    5 MB
|              |   2%    6 MB
|              |   2%    6 MB
|              |   2%    6 MB
|              |   2%    6 MB
|              |   2%    7 MB
|              |   2%    7 MB
|              |   3%    7 MB
|              |   3%    8 MB
|              |   3%    8 MB
|              |   3%    8 MB
|              |   3%    9 MB
|              |   3%    9 MB
|              |   3%    9 MB
|              |   3%    9 MB
|              |   4%   10 MB
|              |   4%   10 MB
|              |   4%   10 MB
|              |   4%   11 MB
|              |   4%   11 MB
|              |   4%   11 MB
|              |   4%   12 MB
|              |   4%   12 MB
|              |   4%   12 MB
|              |   5%   12 MB
|              |   5%   13 MB
|              |   5%   13 MB
|              |   5%   13 MB
|              |   5%   14 MB
|              |   5%   14 MB
|              |   5%   14 MB
|              |   5%   15 MB
|              |   6%   15 MB
|              |   6%   15 MB
|              |   6%   15 MB
|              |   6%   16 MB
|              |   6%   16 MB
|              |   6%   16 MB
|=             |   6%   17 MB
|=             |   6%   17 MB
|=             |   7%   17 MB
|=             |   7%   18 MB
|=             |   7%   18 MB
|=             |   7%   18 MB
|=             |   7%   18 MB
|=             |   7%   19 MB
|=             |   7%   19 MB
|=             |   7%   19 MB
|=             |   7%   20 MB
|=             |   8%   20 MB
|=             |   8%   20 MB
|=             |   8%   21 MB
|=             |   8%   21 MB
|=             |   8%   21 MB
|=             |   8%   21 MB
|=             |   8%   22 MB
|=             |   8%   22 MB
|=             |   9%   22 MB
|=             |   9%   23 MB
|=             |   9%   23 MB
|=             |   9%   23 MB
|=             |   9%   24 MB
|=             |   9%   24 MB
|=             |   9%   24 MB
|=             |   9%   24 MB
|=             |   9%   25 MB
|=             |  10%   25 MB
|=             |  10%   25 MB
|=             |  10%   26 MB
|=             |  10%   26 MB
|=             |  10%   26 MB
|=             |  10%   27 MB
|=             |  10%   27 MB
|=             |  10%   27 MB
|=             |  11%   27 MB
|=             |  11%   28 MB
|=             |  11%   28 MB
|=             |  11%   28 MB
|=             |  11%   29 MB
|=             |  11%   29 MB
|=             |  11%   29 MB
|=             |  11%   30 MB
|=             |  12%   30 MB
|=             |  12%   30 MB
|=             |  12%   31 MB
|=             |  12%   31 MB
|=             |  12%   31 MB
|=             |  12%   31 MB
|=             |  12%   32 MB
|=             |  12%   32 MB
|=             |  12%   32 MB
|=             |  13%   33 MB
|=             |  13%   33 MB
|=             |  13%   33 MB
|==            |  13%   34 MB
|==            |  13%   34 MB
|==            |  13%   34 MB
|==            |  13%   34 MB
|==            |  13%   35 MB
|==            |  14%   35 MB
|==            |  14%   35 MB
|==            |  14%   36 MB
|==            |  14%   36 MB
|==            |  14%   36 MB
|==            |  14%   37 MB
|==            |  14%   37 MB
|==            |  14%   37 MB
|==            |  14%   37 MB
|==            |  15%   38 MB
|==            |  15%   38 MB
|==            |  15%   38 MB
|==            |  15%   39 MB
|==            |  15%   39 MB
|==            |  15%   39 MB
|==            |  15%   40 MB
|==            |  15%   40 MB
|==            |  16%   40 MB
|==            |  16%   40 MB
|==            |  16%   41 MB
|==            |  16%   41 MB
|==            |  16%   41 MB
|==            |  16%   42 MB
|==            |  16%   42 MB
|==            |  16%   42 MB
|==            |  17%   43 MB
|==            |  17%   43 MB
|==            |  17%   43 MB
|==            |  17%   43 MB
|==            |  17%   44 MB
|==            |  17%   44 MB
|==            |  17%   44 MB
|==            |  17%   45 MB
|==            |  17%   45 MB
|==            |  18%   45 MB
|==            |  18%   46 MB
|==            |  18%   46 MB
|==            |  18%   46 MB
|==            |  18%   47 MB
|==            |  18%   47 MB
|==            |  18%   47 MB
|==            |  18%   47 MB
|==            |  19%   48 MB
|==            |  19%   48 MB
|==            |  19%   48 MB
|==            |  19%   49 MB
|==            |  19%   49 MB
|==            |  19%   49 MB
|==            |  19%   50 MB
|==            |  19%   50 MB
|==            |  19%   50 MB
|===           |  20%   50 MB
|===           |  20%   51 MB
|===           |  20%   51 MB
|===           |  20%   51 MB
|===           |  20%   52 MB
|===           |  20%   52 MB
|===           |  20%   52 MB
|===           |  20%   53 MB
|===           |  21%   53 MB
|===           |  21%   53 MB
|===           |  21%   53 MB
|===           |  21%   54 MB
|===           |  21%   54 MB
|===           |  21%   54 MB
|===           |  21%   55 MB
|===           |  21%   55 MB
|===           |  21%   55 MB
|===           |  22%   56 MB
|===           |  22%   56 MB
|===           |  22%   56 MB
|===           |  22%   56 MB
|===           |  22%   57 MB
|===           |  22%   57 MB
|===           |  22%   57 MB
|===           |  22%   58 MB
|===           |  23%   58 MB
|===           |  23%   58 MB
|===           |  23%   59 MB
|===           |  23%   59 MB
|===           |  23%   59 MB
|===           |  23%   59 MB
|===           |  23%   60 MB
|===           |  23%   60 MB
|===           |  24%   60 MB
|===           |  24%   61 MB
|===           |  24%   61 MB
|===           |  24%   61 MB
|===           |  24%   62 MB
|===           |  24%   62 MB
|===           |  24%   62 MB
|===           |  24%   63 MB
|===           |  24%   63 MB
|===           |  25%   63 MB
|===           |  25%   63 MB
|===           |  25%   64 MB
|===           |  25%   64 MB
|===           |  25%   64 MB
|===           |  25%   65 MB
|===           |  25%   65 MB
|===           |  25%   65 MB
|===           |  26%   66 MB
|===           |  26%   66 MB
|===           |  26%   66 MB
|===           |  26%   66 MB
|===           |  26%   67 MB
|===           |  26%   67 MB
|====          |  26%   67 MB
|====          |  26%   68 MB
|====          |  26%   68 MB
|====          |  27%   68 MB
|====          |  27%   69 MB
|====          |  27%   69 MB
|====          |  27%   69 MB
|====          |  27%   69 MB
|====          |  27%   70 MB
|====          |  27%   70 MB
|====          |  27%   70 MB
|====          |  28%   71 MB
|====          |  28%   71 MB
|====          |  28%   71 MB
|====          |  28%   72 MB
|====          |  28%   72 MB
|====          |  28%   72 MB
|====          |  28%   72 MB
|====          |  28%   73 MB
|====          |  29%   73 MB
|====          |  29%   73 MB
|====          |  29%   74 MB
|====          |  29%   74 MB
|====          |  29%   74 MB
|====          |  29%   75 MB
|====          |  29%   75 MB
|====          |  29%   75 MB
|====          |  29%   75 MB
|====          |  30%   76 MB
|====          |  30%   76 MB
|====          |  30%   76 MB
|====          |  30%   77 MB
|====          |  30%   77 MB
|====          |  30%   77 MB
|====          |  30%   78 MB
|====          |  30%   78 MB
|====          |  31%   78 MB
|====          |  31%   78 MB
|====          |  31%   79 MB
|====          |  31%   79 MB
|====          |  31%   79 MB
|====          |  31%   80 MB
|====          |  31%   80 MB
|====          |  31%   80 MB
|====          |  31%   81 MB
|====          |  32%   81 MB
|====          |  32%   81 MB
|====          |  32%   81 MB
|====          |  32%   82 MB
|====          |  32%   82 MB
|====          |  32%   82 MB
|====          |  32%   83 MB
|====          |  32%   83 MB
|====          |  33%   83 MB
|====          |  33%   84 MB
|====          |  33%   84 MB
|=====         |  33%   84 MB
|=====         |  33%   85 MB
|=====         |  33%   85 MB
|=====         |  33%   85 MB
|=====         |  33%   85 MB
|=====         |  34%   86 MB
|=====         |  34%   86 MB
|=====         |  34%   86 MB
|=====         |  34%   87 MB
|=====         |  34%   87 MB
|=====         |  34%   87 MB
|=====         |  34%   88 MB
|=====         |  34%   88 MB
|=====         |  34%   88 MB
|=====         |  35%   88 MB
|=====         |  35%   89 MB
|=====         |  35%   89 MB
|=====         |  35%   89 MB
|=====         |  35%   90 MB
|=====         |  35%   90 MB
|=====         |  35%   90 MB
|=====         |  35%   91 MB
|=====         |  36%   91 MB
|=====         |  36%   91 MB
|=====         |  36%   91 MB
|=====         |  36%   92 MB
|=====         |  36%   92 MB
|=====         |  36%   92 MB
|=====         |  36%   93 MB
|=====         |  36%   93 MB
|=====         |  36%   93 MB
|=====         |  37%   94 MB
|=====         |  37%   94 MB
|=====         |  37%   94 MB
|=====         |  37%   94 MB
|=====         |  37%   95 MB
|=====         |  37%   95 MB
|=====         |  37%   95 MB
|=====         |  37%   96 MB
|=====         |  38%   96 MB
|=====         |  38%   96 MB
|=====         |  38%   97 MB
|=====         |  38%   97 MB
|=====         |  38%   97 MB
|=====         |  38%   97 MB
|=====         |  38%   98 MB
|=====         |  38%   98 MB
|=====         |  39%   98 MB
|=====         |  39%   99 MB
|=====         |  39%   99 MB
|=====         |  39%   99 MB
|=====         |  39%  100 MB
|=====         |  39%  100 MB
|=====         |  39%  100 MB
|=====         |  39%  101 MB
|=====         |  39%  101 MB
|======        |  40%  101 MB
|======        |  40%  101 MB
|======        |  40%  102 MB
|======        |  40%  102 MB
|======        |  40%  102 MB
|======        |  40%  103 MB
|======        |  40%  103 MB
|======        |  40%  103 MB
|======        |  41%  104 MB
|======        |  41%  104 MB
|======        |  41%  104 MB
|======        |  41%  104 MB
|======        |  41%  105 MB
|======        |  41%  105 MB
|======        |  41%  105 MB
|======        |  41%  106 MB
|======        |  42%  106 MB
|======        |  42%  106 MB
|======        |  42%  107 MB
|======        |  42%  107 MB
|======        |  42%  107 MB
|======        |  42%  107 MB
|======        |  42%  108 MB
|======        |  42%  108 MB
|======        |  42%  108 MB
|======        |  43%  109 MB
|======        |  43%  109 MB
|======        |  43%  109 MB
|======        |  43%  110 MB
|======        |  43%  110 MB
|======        |  43%  110 MB
|======        |  43%  110 MB
|======        |  43%  111 MB
|======        |  44%  111 MB
|======        |  44%  111 MB
|======        |  44%  112 MB
|======        |  44%  112 MB
|======        |  44%  112 MB
|======        |  44%  113 MB
|======        |  44%  113 MB
|======        |  44%  113 MB
|======        |  44%  113 MB
|======        |  45%  114 MB
|======        |  45%  114 MB
|======        |  45%  114 MB
|======        |  45%  115 MB
|======        |  45%  115 MB
|======        |  45%  115 MB
|======        |  45%  116 MB
|======        |  45%  116 MB
|======        |  46%  116 MB
|======        |  46%  116 MB
|======        |  46%  117 MB
|======        |  46%  117 MB
|======        |  46%  117 MB
|======        |  46%  118 MB
|=======       |  46%  118 MB
|=======       |  46%  118 MB
|=======       |  47%  119 MB
|=======       |  47%  119 MB
|=======       |  47%  119 MB
|=======       |  47%  120 MB
|=======       |  47%  120 MB
|=======       |  47%  120 MB
|=======       |  47%  120 MB
|=======       |  47%  121 MB
|=======       |  47%  121 MB
|=======       |  48%  121 MB
|=======       |  48%  122 MB
|=======       |  48%  122 MB
|=======       |  48%  122 MB
|=======       |  48%  123 MB
|=======       |  48%  123 MB
|=======       |  48%  123 MB
|=======       |  48%  123 MB
|=======       |  49%  124 MB
|=======       |  49%  124 MB
|=======       |  49%  124 MB
|=======       |  49%  125 MB
|=======       |  49%  125 MB
|=======       |  49%  125 MB
|=======       |  49%  126 MB
|=======       |  49%  126 MB
|=======       |  49%  126 MB
|=======       |  50%  126 MB
|=======       |  50%  127 MB
|=======       |  50%  127 MB
|=======       |  50%  127 MB
|=======       |  50%  128 MB
|=======       |  50%  128 MB
|=======       |  50%  128 MB
|=======       |  50%  129 MB
|=======       |  51%  129 MB
|=======       |  51%  129 MB
|=======       |  51%  129 MB
|=======       |  51%  130 MB
|=======       |  51%  130 MB
|=======       |  51%  130 MB
|=======       |  51%  131 MB
|=======       |  51%  131 MB
|=======       |  51%  131 MB
|=======       |  52%  132 MB
|=======       |  52%  132 MB
|=======       |  52%  132 MB
|=======       |  52%  132 MB
|=======       |  52%  133 MB
|=======       |  52%  133 MB
|=======       |  52%  133 MB
|=======       |  52%  134 MB
|=======       |  53%  134 MB
|=======       |  53%  134 MB
|=======       |  53%  135 MB
|========      |  53%  135 MB
|========      |  53%  135 MB
|========      |  53%  135 MB
|========      |  53%  136 MB
|========      |  53%  136 MB
|========      |  54%  136 MB
|========      |  54%  137 MB
|========      |  54%  137 MB
|========      |  54%  137 MB
|========      |  54%  138 MB
|========      |  54%  138 MB
|========      |  54%  138 MB
|========      |  54%  139 MB
|========      |  54%  139 MB
|========      |  55%  139 MB
|========      |  55%  139 MB
|========      |  55%  140 MB
|========      |  55%  140 MB
|========      |  55%  140 MB
|========      |  55%  141 MB
|========      |  55%  141 MB
|========      |  55%  141 MB
|========      |  56%  142 MB
|========      |  56%  142 MB
|========      |  56%  142 MB
|========      |  56%  142 MB
|========      |  56%  143 MB
|========      |  56%  143 MB
|========      |  56%  143 MB
|========      |  56%  144 MB
|========      |  57%  144 MB
|========      |  57%  144 MB
|========      |  57%  145 MB
|========      |  57%  145 MB
|========      |  57%  145 MB
|========      |  57%  145 MB
|========      |  57%  146 MB
|========      |  57%  146 MB
|========      |  57%  146 MB
|========      |  58%  147 MB
|========      |  58%  147 MB
|========      |  58%  147 MB
|========      |  58%  148 MB
|========      |  58%  148 MB
|========      |  58%  148 MB
|========      |  58%  149 MB
|========      |  58%  149 MB
|========      |  59%  149 MB
|========      |  59%  149 MB
|========      |  59%  150 MB
|========      |  59%  150 MB
|========      |  59%  150 MB
|========      |  59%  151 MB
|========      |  59%  151 MB
|========      |  59%  151 MB
|========      |  59%  152 MB
|=========     |  60%  152 MB
|=========     |  60%  152 MB
|=========     |  60%  152 MB
|=========     |  60%  153 MB
|=========     |  60%  153 MB
|=========     |  60%  153 MB
|=========     |  60%  154 MB
|=========     |  60%  154 MB
|=========     |  61%  154 MB
|=========     |  61%  155 MB
|=========     |  61%  155 MB
|=========     |  61%  155 MB
|=========     |  61%  155 MB
|=========     |  61%  156 MB
|=========     |  61%  156 MB
|=========     |  61%  156 MB
|=========     |  62%  157 MB
|=========     |  62%  157 MB
|=========     |  62%  157 MB
|=========     |  62%  158 MB
|=========     |  62%  158 MB
|=========     |  62%  158 MB
|=========     |  62%  158 MB
|=========     |  62%  159 MB
|=========     |  62%  159 MB
|=========     |  63%  159 MB
|=========     |  63%  160 MB
|=========     |  63%  160 MB
|=========     |  63%  160 MB
|=========     |  63%  161 MB
|=========     |  63%  161 MB
|=========     |  63%  161 MB
|=========     |  63%  161 MB
|=========     |  64%  162 MB
|=========     |  64%  162 MB
|=========     |  64%  162 MB
|=========     |  64%  163 MB
|=========     |  64%  163 MB
|=========     |  64%  163 MB
|=========     |  64%  164 MB
|=========     |  64%  164 MB
|=========     |  64%  164 MB
|=========     |  65%  164 MB
|=========     |  65%  165 MB
|=========     |  65%  165 MB
|=========     |  65%  165 MB
|=========     |  65%  166 MB
|=========     |  65%  166 MB
|=========     |  65%  166 MB
|=========     |  65%  167 MB
|=========     |  66%  167 MB
|=========     |  66%  167 MB
|=========     |  66%  168 MB
|=========     |  66%  168 MB
|=========     |  66%  168 MB
|=========     |  66%  168 MB
|==========    |  66%  169 MB
|==========    |  66%  169 MB
|==========    |  67%  169 MB
|==========    |  67%  170 MB
|==========    |  67%  170 MB
|==========    |  67%  170 MB
|==========    |  67%  171 MB
|==========    |  67%  171 MB
|==========    |  67%  171 MB
|==========    |  67%  171 MB
|==========    |  67%  172 MB
|==========    |  68%  172 MB
|==========    |  68%  172 MB
|==========    |  68%  173 MB
|==========    |  68%  173 MB
|==========    |  68%  173 MB
|==========    |  68%  174 MB
|==========    |  68%  174 MB
|==========    |  68%  174 MB
|==========    |  69%  174 MB
|==========    |  69%  175 MB
|==========    |  69%  175 MB
|==========    |  69%  175 MB
|==========    |  69%  176 MB
|==========    |  69%  176 MB
|==========    |  69%  176 MB
|==========    |  69%  177 MB
|==========    |  69%  177 MB
|==========    |  70%  177 MB
|==========    |  70%  177 MB
|==========    |  70%  178 MB
|==========    |  70%  178 MB
|==========    |  70%  178 MB
|==========    |  70%  179 MB
|==========    |  70%  179 MB
|==========    |  70%  179 MB
|==========    |  71%  180 MB
|==========    |  71%  180 MB
|==========    |  71%  180 MB
|==========    |  71%  180 MB
|==========    |  71%  181 MB
|==========    |  71%  181 MB
|==========    |  71%  181 MB
|==========    |  71%  182 MB
|==========    |  72%  182 MB
|==========    |  72%  182 MB
|==========    |  72%  183 MB
|==========    |  72%  183 MB
|==========    |  72%  183 MB
|==========    |  72%  184 MB
|==========    |  72%  184 MB
|==========    |  72%  184 MB
|==========    |  72%  184 MB
|==========    |  73%  185 MB
|==========    |  73%  185 MB
|==========    |  73%  185 MB
|===========   |  73%  186 MB
|===========   |  73%  186 MB
|===========   |  73%  186 MB
|===========   |  73%  187 MB
|===========   |  73%  187 MB
|===========   |  74%  187 MB
|===========   |  74%  187 MB
|===========   |  74%  188 MB
|===========   |  74%  188 MB
|===========   |  74%  188 MB
|===========   |  74%  189 MB
|===========   |  74%  189 MB
|===========   |  74%  189 MB
|===========   |  74%  190 MB
|===========   |  75%  190 MB
|===========   |  75%  190 MB
|===========   |  75%  190 MB
|===========   |  75%  191 MB
|===========   |  75%  191 MB
|===========   |  75%  191 MB
|===========   |  75%  192 MB
|===========   |  75%  192 MB
|===========   |  76%  192 MB
|===========   |  76%  193 MB
|===========   |  76%  193 MB
|===========   |  76%  193 MB
|===========   |  76%  193 MB
|===========   |  76%  194 MB
|===========   |  76%  194 MB
|===========   |  76%  194 MB
|===========   |  77%  195 MB
|===========   |  77%  195 MB
|===========   |  77%  195 MB
|===========   |  77%  196 MB
|===========   |  77%  196 MB
|===========   |  77%  196 MB
|===========   |  77%  196 MB
|===========   |  77%  197 MB
|===========   |  77%  197 MB
|===========   |  78%  197 MB
|===========   |  78%  198 MB
|===========   |  78%  198 MB
|===========   |  78%  198 MB
|===========   |  78%  199 MB
|===========   |  78%  199 MB
|===========   |  78%  199 MB
|===========   |  78%  199 MB
|===========   |  79%  200 MB
|===========   |  79%  200 MB
|===========   |  79%  200 MB
|===========   |  79%  201 MB
|===========   |  79%  201 MB
|===========   |  79%  201 MB
|===========   |  79%  202 MB
|===========   |  79%  202 MB
|===========   |  79%  202 MB
|============  |  80%  202 MB
|============  |  80%  203 MB
|============  |  80%  203 MB
|============  |  80%  203 MB
|============  |  80%  204 MB
|============  |  80%  204 MB
|============  |  80%  204 MB
|============  |  80%  205 MB
|============  |  81%  205 MB
|============  |  81%  205 MB
|============  |  81%  206 MB
|============  |  81%  206 MB
|============  |  81%  206 MB
|============  |  81%  206 MB
|============  |  81%  207 MB
|============  |  81%  207 MB
|============  |  82%  207 MB
|============  |  82%  208 MB
|============  |  82%  208 MB
|============  |  82%  208 MB
|============  |  82%  209 MB
|============  |  82%  209 MB
|============  |  82%  209 MB
|============  |  82%  209 MB
|============  |  82%  210 MB
|============  |  83%  210 MB
|============  |  83%  210 MB
|============  |  83%  211 MB
|============  |  83%  211 MB
|============  |  83%  211 MB
|============  |  83%  212 MB
|============  |  83%  212 MB
|============  |  83%  212 MB
|============  |  84%  212 MB
|============  |  84%  213 MB
|============  |  84%  213 MB
|============  |  84%  213 MB
|============  |  84%  214 MB
|============  |  84%  214 MB
|============  |  84%  214 MB
|============  |  84%  215 MB
|============  |  84%  215 MB
|============  |  85%  215 MB
|============  |  85%  215 MB
|============  |  85%  216 MB
|============  |  85%  216 MB
|============  |  85%  216 MB
|============  |  85%  217 MB
|============  |  85%  217 MB
|============  |  85%  217 MB
|============  |  86%  218 MB
|============  |  86%  218 MB
|============  |  86%  218 MB
|============  |  86%  218 MB
|============  |  86%  219 MB
|============  |  86%  219 MB
|============= |  86%  219 MB
|============= |  86%  220 MB
|============= |  87%  220 MB
|============= |  87%  220 MB
|============= |  87%  221 MB
|============= |  87%  221 MB
|============= |  87%  221 MB
|============= |  87%  221 MB
|============= |  87%  222 MB
|============= |  87%  222 MB
|============= |  87%  222 MB
|============= |  88%  223 MB
|============= |  88%  223 MB
|============= |  88%  223 MB
|============= |  88%  224 MB
|============= |  88%  224 MB
|============= |  88%  224 MB
|============= |  88%  225 MB
|============= |  88%  225 MB
|============= |  89%  225 MB
|============= |  89%  225 MB
|============= |  89%  226 MB
|============= |  89%  226 MB
|============= |  89%  226 MB
|============= |  89%  227 MB
|============= |  89%  227 MB
|============= |  89%  227 MB
|============= |  89%  228 MB
|============= |  90%  228 MB
|============= |  90%  228 MB
|============= |  90%  228 MB
|============= |  90%  229 MB
|============= |  90%  229 MB
|============= |  90%  229 MB
|============= |  90%  230 MB
|============= |  90%  230 MB
|============= |  91%  230 MB
|============= |  91%  231 MB
|============= |  91%  231 MB
|============= |  91%  231 MB
|============= |  91%  231 MB
|============= |  91%  232 MB
|============= |  91%  232 MB
|============= |  91%  232 MB
|============= |  92%  233 MB
|============= |  92%  233 MB
|============= |  92%  233 MB
|============= |  92%  234 MB
|============= |  92%  234 MB
|============= |  92%  234 MB
|============= |  92%  234 MB
|============= |  92%  235 MB
|============= |  92%  235 MB
|============= |  93%  235 MB
|============= |  93%  236 MB
|============= |  93%  236 MB
|==============|  93%  236 MB
|==============|  93%  237 MB
|==============|  93%  237 MB
|==============|  93%  237 MB
|==============|  93%  238 MB
|==============|  94%  238 MB
|==============|  94%  238 MB
|==============|  94%  238 MB
|==============|  94%  239 MB
|==============|  94%  239 MB
|==============|  94%  239 MB
|==============|  94%  240 MB
|==============|  94%  240 MB
|==============|  94%  240 MB
|==============|  95%  241 MB
|==============|  95%  241 MB
|==============|  95%  241 MB
|==============|  95%  241 MB
|==============|  95%  242 MB
|==============|  95%  242 MB
|==============|  95%  242 MB
|==============|  95%  243 MB
|==============|  96%  243 MB
|==============|  96%  243 MB
|==============|  96%  244 MB
|==============|  96%  244 MB
|==============|  96%  244 MB
|==============|  96%  244 MB
|==============|  96%  245 MB
|==============|  96%  245 MB
|==============|  97%  245 MB
|==============|  97%  246 MB
|==============|  97%  246 MB
|==============|  97%  246 MB
|==============|  97%  247 MB
|==============|  97%  247 MB
|==============|  97%  247 MB
|==============|  97%  248 MB
|==============|  97%  248 MB
|==============|  98%  248 MB
|==============|  98%  248 MB
|==============|  98%  249 MB
|==============|  98%  249 MB
|==============|  98%  249 MB
|==============|  98%  250 MB
|==============|  98%  250 MB
|==============|  98%  250 MB
|==============|  99%  251 MB
|==============|  99%  251 MB
|==============|  99%  251 MB
|==============|  99%  251 MB
|==============|  99%  252 MB
|==============|  99%  252 MB
|==============|  99%  252 MB
|==============|  99%  253 MB
|===============| 100%  253 MB
|===============| 100%  253 MB
dtrain = merge(train, fastest_route_train, by="id")
dtrain[,number_of_streets := number_of_steps - 1]
plot1 <- 
  dtrain[, list(mean_trip_duration = mean(total_travel_time)), by = number_of_streets] %>%
  ggplot(aes(x = as.factor(number_of_streets), y = mean_trip_duration)) +
  geom_bar(stat = 'identity', fill = 'steelblue') +
  labs(x = 'Number of Streets', y = 'Mean Trip Duration', title = 'Mean Trip duration by Number of Streets')
plot2 <- dtrain[, list(Number_of_Rides = .N), by = number_of_streets] %>%
  ggplot(aes(x = as.factor(number_of_streets), y = Number_of_Rides)) +
  geom_bar(stat = 'identity', fill = 'steelblue') +
  labs(x = 'Number of Streets', y = 'Number of Trips', title = 'Number of Rides by Number of Streets')
plot3 <- dtrain[, list(mean_distance = mean(total_distance)/1000), by = number_of_streets] %>%
  ggplot(aes(x = as.factor(number_of_streets), y = mean_distance)) +
  geom_bar(stat = 'identity', fill = 'steelblue') +
  labs(x = 'Number of Streets', y = 'Mean Trip Distnace(km)', title = 'Mean Trip Distance by Number of Streets')
grid.arrange(plot1,plot2, plot3)

plot1 <- dtrain %>%
  ggplot(aes(trip_duration)) +
  geom_density(fill = "red", alpha = 0.5) +
  geom_density(aes(total_travel_time), fill = "blue", alpha = 0.5) +
  scale_x_log10() +
  coord_cartesian(xlim = c(5e1, 8e3))
dtrain[,diff:= abs(trip_duration-total_travel_time)]
dtrain[,number_of_steps:= ifelse(number_of_steps>= 25, 25, number_of_steps)]
plot2 =  dtrain[, list(mean_distance_km = mean(diff)), by=number_of_steps-1] %>%
  ggplot(aes(x=number_of_steps, y=mean_distance_km)) + 
  geom_bar(stat='identity', fill='steelblue') + 
  labs(x='Number of Streets', y='|TripDuration - TotalTravelTime)|')
grid.arrange(plot1, plot2, ncol=2)

Google Distance Matrix

suppressMessages({
google_dist = read_csv("./data/new-york-city-taxi-with-osrm/train_distance_matrix.csv")
})
google_dist = data.table(google_dist)
google_dist[, diff := google_duration-trip_duration]
plot1 <- google_dist %>%
  ggplot(aes(trip_duration)) +
  geom_density(fill = "red", alpha = 0.5) +
  geom_density(aes(google_duration), fill = "blue", alpha = 0.5) +
  scale_x_log10() +
  coord_cartesian(xlim = c(5e1, 8e3))
plot2 = google_dist %>% 
  ggplot(aes(x=diff)) + 
  geom_histogram(bins=20000, fill="red")+
  theme_bw()+theme(axis.title = element_text(size=12),axis.text = element_text(size=12))+
  ylab("Density")+coord_cartesian(x=c(-2000,2000))
grid.arrange(plot1, plot2, ncol=2)

Weather Data

weather = fread("./data/new-york-city-taxi-with-osrm/weather_data_nyc_centralpark_2016.csv")
weather <- weather %>%
  mutate(date = dmy(date),
         rain = as.numeric(ifelse(precipitation == "T", "0.01", precipitation)),
         s_fall = as.numeric(ifelse(`snow fall` == "T", "0.01", `snow fall`)),
         s_depth = as.numeric(ifelse(`snow depth` == "T", "0.01", `snow depth`)),
         all_precip = s_fall + rain,
         has_snow = (s_fall > 0) | (s_depth > 0),
         has_rain = rain > 0,
         max_temp = `maximum temerature`,
         min_temp = `minimum temperature`)
weather = as.data.table(weather)
weather[, c("precipitation", "snow fall", "snow depth", "maximum temerature", "minimum temperature") := NULL]
setkey(dtrain, dropoff_datetime)
setkey(weather, date)
dtrain = weather[dtrain]
plot1 = dtrain %>%
  group_by(pickup_hour, has_snow) %>%
  summarise(duration = mean(trip_duration)) %>%
  ggplot(aes(pickup_hour,duration, color = has_snow)) +
  geom_jitter(width = 0.01, size = 2) +
  labs(x = "hour", y = "trip duration")
plot2 = dtrain %>% 
  group_by(pickup_hour, has_snow) %>%
  summarise(distance = mean(distance_km)) %>%
  ggplot(aes(pickup_hour,distance, color = has_snow)) +
  geom_jitter(width = 0.01, size = 2) +
  labs(x = "hour", y = "Distance Covered")
grid.arrange(plot1, plot2,ncol=1)

plot1 = dtrain %>%
  group_by(pickup_hour, has_rain) %>%
  summarise(duration = mean(trip_duration)) %>%
  ggplot(aes(pickup_hour,duration, color = has_rain)) +
  geom_jitter(width = 0.01, size = 2) +
  labs(x = "hour", y = "trip duration")
plot2 = dtrain %>% 
  group_by(pickup_hour, has_rain) %>%
  summarise(distance = mean(distance_km)) %>%
  ggplot(aes(pickup_hour,distance, color = has_rain)) +
  geom_jitter(width = 0.01, size = 2) +
  labs(x = "hour", y = "Distance Covered")
grid.arrange(plot1, plot2,ncol=1)

METAR

train <-  fread("./data/train.csv")

Read 30.2% of 1458644 rows
Read 48.0% of 1458644 rows
Read 65.8% of 1458644 rows
Read 83.6% of 1458644 rows
Read 1458644 rows and 11 (of 11) columns from 0.187 GB file in 00:00:06
weather_nyc <-  fread("./data/KNYC_Metars.csv")
train[, pi_dt_shift :=  paste(substr(pickup_datetime, 1, 13), ":00:00", sep = "")]
train[, df_dt_shift := paste(substr(dropoff_datetime, 1, 13), ":00:00", sep = "")]
train_joined <- dplyr::left_join(train, weather_nyc, by  = c("pi_dt_shift" = "Time"))
train_joined$Conditions[is.na(train_joined$Conditions) ==  TRUE] <- "Unknown"
weather_condition_freq <- train_joined %>%
  group_by(Conditions) %>%
  select(Conditions,trip_duration ) %>%
  summarize(count = n(), 
            mean_dur = mean(trip_duration, na.rm = TRUE), 
            sd_dur =   sd(trip_duration, na.rm = TRUE), 
            median_dur = median(trip_duration, na.rm = TRUE))
datatable(weather_condition_freq)
highchart()%>%
  hc_add_series(weather_condition_freq, "spline", hcaes(x =  Conditions, y = mean_dur), name = "Mean Trip Duration") %>%
  hc_add_series(weather_condition_freq, "spline", hcaes(x =  Conditions, y = median_dur), name = "Median Trip Duration") %>%
  hc_add_series(weather_condition_freq, "spline", hcaes(x =  Conditions, y = sd_dur), name = "SD Trip Duration") %>%
  hc_plotOptions(series = list(
    showInLegend = TRUE, 
    pointFormat = "{point.y}%"
  ), 
  column = list(colorByPoint = TRUE)) %>%
  hc_subtitle(text = "Count by Conditions Caegories") %>%
  hc_credits(
    enabled = TRUE, 
    text = "Source: Kaggle", 
    href = "https://kaggle.com/damianpanek", 
    style = list(fontSize = "12px")
  ) %>%
  hc_add_theme(hc_theme_google())
train_joined <- data.table(train_joined)
train_joined <- train_joined[is.na(pickup_datetime) == FALSE,  ]
train_joined[, pickup_datetime := as.POSIXct(pickup_datetime, format = "%Y-%m-%d %H:%M:%S")]
train_joined[, dropoff_datetime := as.POSIXct(dropoff_datetime, format = "%Y-%m-%d %H:%M:%S")]
train_joined[, pickup_day := format(pickup_datetime, "%Y-%m-%d")]
train_joined[, pickup_month := format(pickup_datetime, "%Y-%m")]
train_joined[, dropoff_day := format(dropoff_datetime, "%Y-%m-%d")]
train_joined[, dropoff_month := format(dropoff_datetime, "%Y-%m")]
train_joined[, weekday := weekdays(pickup_datetime)]
weather_temp_day <-  train_joined %>% 
  group_by(pickup_day) %>%
  select(pickup_day, Temp., Conditions) %>%
  summarize(count = n(), 
            min = min(Temp., na.rm = TRUE), 
            max = max(Temp., na.rm = TRUE), 
            sd_dur = sd(Temp., na.rm = TRUE))

hchart(weather_temp_day, 
        type = "columnrange", 
        hcaes(x = pickup_day, low = min, high = max, color = sd_dur)) %>%
        hc_chart(polar = TRUE) %>%
    hc_yAxis(max = 30,  min = -10, labels = list(format = "{value} "), 
             showFirstLabel = FALSE) %>%
  hc_xAxis(
  title = list(text = ""), gridLineWidth = 0.5,
  labels = list(format = "{value: %b}")) %>%
  hc_add_theme(hc_theme_google()) %>%
hc_title(text = "Min/Max temperature daily, coloured by SD(Temp)")

Leaflet section

#install.packages('leaflet.extras')
library(leaflet)
library(leaflet.extras)
lon_lat <- train_joined[, c("pickup_longitude", "pickup_latitude", 
"dropoff_longitude", "dropoff_latitude")]
lon_lat$rown <- as.numeric(rownames(lon_lat))
lon_min <- lon_lat[rown < 300 ,]
str(lon_min)
Classes ‘data.table’ and 'data.frame':  299 obs. of  5 variables:
 $ pickup_longitude : num  -74 -74 -74 -74 -74 ...
 $ pickup_latitude  : num  40.8 40.7 40.8 40.7 40.8 ...
 $ dropoff_longitude: num  -74 -74 -74 -74 -74 ...
 $ dropoff_latitude : num  40.8 40.7 40.7 40.7 40.8 ...
 $ rown             : num  1 2 3 4 5 6 7 8 9 10 ...
 - attr(*, ".internal.selfref")=<externalptr> 
drop <- lon_min[, c("pickup_longitude", "pickup_latitude", "rown")]
pick <- lon_min[, c("dropoff_longitude", "dropoff_latitude", "rown")]
colnames(drop)  <- c("lon", "lat", "rown")
colnames(pick) <- colnames(drop)
all_bin_min <- bind_rows(drop, pick)
all_bin_min$rown2 <- rep(1:nrow(all_bin_min)+1/2,each = 2)
Supplied 1196 items to be assigned to 598 items of column 'rown2' (598 unused)
leaflet(data = all_bin_min) %>% addTiles() %>%
  addCircles(~lon, ~lat) %>%
  addPolygons(data = all_bin_min, lng = ~lon, 
               lat = ~lat, 
               stroke = 0.03, color =  "blue", weight = 0.4, 
               opacity = 1.2)  %>% enableMeasurePath() 
 leaflet(data = train_joined[1:50000, ]) %>% addTiles() %>%
  addMarkers(~pickup_longitude, ~pickup_latitude, clusterOptions = markerClusterOptions()) 
train_count <- train_joined %>% 
                select(pickup_latitude, pickup_longitude) %>%
                group_by(pickup_latitude, pickup_longitude) %>%
                summarize(count = n())
train_count <- train_count[train_count$count >1,]
 leaflet(data = train_count) %>% addTiles() %>% 
 addHeatmap(lng = ~pickup_longitude, lat = ~pickup_latitude, intensity = ~count,
             blur = 20, max = 0.05, radius = 15)
train_count <- train_joined %>% 
                select(pickup_latitude, pickup_longitude, pickup_month) %>%
                group_by(pickup_latitude, pickup_longitude, pickup_month) %>%
                summarize(count = n())
train_count <- train_count[train_count$count >1,]
 leaflet(data = train_count) %>% addTiles() %>% 
 addHeatmap(lng = ~pickup_longitude, lat = ~pickup_latitude,
 layerId = ~pickup_month, group = ~pickup_month, intensity = ~count,
             blur = 20, max = 0.05, radius = 15)
count_weekday <- train_joined %>%
                  select(weekday) %>%
                  group_by(weekday) %>%
                  summarize(count = n())
count_weekday <- data.table(count_weekday)
count_weekday <- count_weekday[is.na(weekday)  ==  FALSE, ]
count_weekday <- data.frame(count_weekday)
tm <- treemap(count_weekday , index = c("weekday"),
              vSize = "count")

hctreemap(tm)
LS0tCnRpdGxlOiAiVGF4aShSKSDspJHqsITrsJztkZwg7J6Q66OMIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCiMjIE5ldyBZb3JrIENpdHkgVGF4aSBUcmlwIER1cmF0aW9uCgotIEthZ2dsZeydgCDribTsmpXsi5zsl5DshJwg7YOd7IucIOyXrO2WieydmCDstJ0g7KO87ZaJIOqxsOumrOulvCDsmIjsuKHtlZjripQg66qo64247J2EIOunjOuTnOuKlCDqsoPsl5Ag64+E7KCE7ZWY6rOgIOyeiOyKteuLiOuLpC4gCgotIOq4sOuzuCDrjbDsnbTthLAg7IS47Yq464qUIO2UveyXhSDsi5zqsIQsIOyngOumrOyggSDsooztkZwsIOyKueqwnSDsiJgg67CPIOq4sO2DgCDsl6zrn6wg67OA7IiY6rCAIO2PrO2VqCDrkJwgTllDIO2DneyLnCDrsI8g66as66y07KeE7JyE7JuQ7ZqM7JeQ7IScIOuwnOq4iSDtlZwg642w7J207YSwIOyEuO2KuOyeheuLiOuLpC4KCi0g7Jqw66as6rCAIDIwMTUg64WE7JeQIOyjvOy1nCDtlZwgRUNNTCAvIFBLREQg7Jes7ZaJIOyLnOqwhCDrj4TsoITqs7wg7Jyg7IKs7ZWY64uk64qUIOqyg+ydhCDsnbjsoJXtlaAg6rKD7J6F64uI64ukLiDqt7jrn6zrgpgg7J20IOuPhOyghOydgCDrkqTso73rsJXso73snoXri4jri6QuIAoKLSDsmrDrpqzripQg64uk66W4IOywuOqwgOyekOqwgCDsnpDsi6DsnZgg7JiI7Lih7JeQIOyCrOyaqe2VoCDsiJjsnojripQg7LaU6rCAIOq1kOycoSDrjbDsnbTthLDrpbwg6rKM7Iuc7ZWY64+E66GdICjtmITquIgg7IOB6riI6rO8IO2VqOq7mCkg64u57Iug7J2EIOqyqeugpO2VqeuLiOuLpC4gCgotIOyasOumrOuKlCDsu6TrrqTri4jti7Dsl5Ag7Yq57Z6IIO2GteywsOugpSDsnojqsbDrgpgg6rCA7LmY7J6I64qUIOy7pOuEkCDsnpHshLHsnpDsl5Dqsowg67O07IOB7ZWY6riwIOychO2VtCDqsqnso7wg67CPIOy1nOyihSDsg4HsnYQg7KeA7KCV7ZaI7Iq164uI64ukLgoKCiMjIyDtj4nqsIDtlajsiJgoRXZhbHV0aW9uKQotIFJNU0xFKFJvb3QgTWVhbiBTcXVhcmVkIExvZ2FyaXRobWljIEVycm9yKQokJFxlcHNpbG9uID0gXHNxcnR7XGZyYWN7MX17bn0gXHN1bV97aT0xfV5uIChcbG9nKHBfaSArIDEpIC0gXGxvZyhhX2krMSkpXjIgfSQkCgpgYGAKaWQsdHJpcF9kdXJhdGlvbgppZDAwMDAxLDk3OAppZDAwMDAyLDk3OAppZDAwMDAzLDk3OAppZDAwMDA0LDk3OApldGMuCmBgYAoKIyMjIERhdGEg7IaM6rCcCi0g6rK97J+BIOuNsOydtO2EsCDshLjtirjripQgR29vZ2xlIENsb3VkIFBsYXRmb3Jt7J2YIEJpZyBRdWVyeeyXkOyEnCDsoJzqs7XrkJjripQgMjAxNiDrhYQgTllDIFllbGxvdyBDYWIg7Jes7ZaJIOq4sOuhnSDrjbDsnbTthLDrpbwg6riw67CY7Jy866Gc7ZWp64uI64ukLiAKCi0g7J20IOuNsOydtO2EsOuKlCDsm5DrnpggTllDIO2DneyLnCDrsI8g66as66y07KeE7JyE7JuQ7ZqMIChUTEMp7JeQ7IScIOuwnOqwhCDtlZwg6rKD7J6F64uI64ukLiAKCi0g642w7J207YSw64qUIOydtCDrhoDsnbTthLAg6rK97J+B7J2YIOuqqeyggeydhCDsnITtlbQg7IOY7ZSM66eB65CY6rOgIOyyreyGjOuQmOyXiOyKteuLiOuLpC4gCi0g7LC46rCA7J6Q64qUIOqwnOuzhCDsl6ztlokg7IaN7ISx7JeQIOuUsOudvCDthYzsiqTtirgg7IS47Yq47J2YIOqwgSDsl6ztlokg6riw6rCE7J2EIOyYiOy4oe2VtOyVvCDtlanri4jri6QuCgojIyMg642w7J207YSwIO2VhOuTnAoKLSBpZCA6IOqwgSDstpzsnqXsnZgg6rOg7JygIOyLneuzhOyekAotIHZlbmRvcl9pZCA6IOyXrO2WiSDquLDroZ3qs7wg7Jew6rKw65CcIOqzteq4ieyekOulvCDrgpjtg4DrgrTripQg7L2U65OcCi0gcGlja3VwX2RhdGV0aW1lIDog66+47YSw6rCAIOyekeuPmSDrkJwg64Kg7Kec7JmAIOyLnOqwhAotIGRyb3BvZmZfZGF0ZXRpbWUgOiDrr7jthLDqsIAg67aE66asIOuQnCDrgqDsp5zsmYAg7Iuc6rCECi0gcGFzc2VuZ2VyX2NvdW50IDog7LCo65+J7J2YIOyKueqwnSDsiJggKOyatOyghOyekOqwgCDsnoXroKUg7ZWcIOqwkikKLSBwaWNrdXBfbG9uZ2l0dWRlIDog66+47YSw6rCAIOyCrOyaqSDrkJwg6rK964+ECi0gcGlja3VwX2xhdGl0dWRlIDog66+47YSw6rCAIOyCrOyaqSDrkJwg7JyE64+ECi0gZHJvcG9mZl9sb25naXR1ZGUgOiDrr7jthLDqsIAg67aE66asIOuQnCDqsr3rj4QKLSBkcm9wb2ZmX2xhdGl0dWRlIDog66+47YSw6rCAIOu2hOumrCDrkJwg7JyE64+ECi0gc3RvcmVfYW5kX2Z3ZF9mbGFnIDog7ZSM656Y6re464qUIOyekOuPmeywqOqwgCDshJzrsoTsl5Ag7Jew6rKw65CY7Ja0IOyeiOyngCDslYrslYQg7Jes7ZaJIOq4sOuhneydtCDssKjrn4kg66mU66qo66as7JeQIOuztOq0gOuQmOyXiOuKlOyngCDsl6zrtoDrpbwg64KY7YOA64OF64uI64ukLiAKICAtIFkgPSDsoIDsnqUg67CPIOyghOuLrDsgTiA9IOyDgeygkCDrsI8g7Iic7ZqMIOyXrO2WiSDrtojqsIAKCi0gdHJpcF9kdXJhdGlvbiA6IOyXrO2WiSDquLDqsIQgKOy0iCkKCiog66m07LGFIOyhsO2VrSA6IOy7pOuEkOyXkOyEnCDsgqzsmqntlaAg7ZmV7J6lIOuQnCDrs4DsiJgg7KeR7ZWp7J2EIOygnOqzte2VmOq4sCDsnITtlbQg642w7J207YSwIOynke2VqSDsiJzshJzsl5DshJwg65Oc66GtIOyYpO2UhCDsooztkZzrpbwg7KCc6rGw7ZWY7KeAIOyViuq4sOuhnCDqsrDsoJXtlojsirXri4jri6QuCgojIyMgUmVmIOyekOujjAotIGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vd3RpMjAwL2V4cGxvcmF0b3J5LWFuYWx5c2lzLW55Yy10YXhpLXRyaXAKLSBodHRwczovL3d3dy5rYWdnbGUuY29tL2FtYmFyaXNoL3R1dG9yaWFsc3R5bGUtZWRhdG9tb2RlbC1sYi0wLTM5MQotIGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vaGVhZHNvcnRhaWxzL255Yy10YXhpLWVkYS11cGRhdGUtdGhlLWZhc3QtdGhlLWN1cmlvdXMvbm90ZWJvb2sKLSBodHRwczovL3d3dy5rYWdnbGUuY29tL2RhbWlhbnBhbmVrL2ludGVyYWN0aXZlLWVkYS1ueXRheGktaGlnaGNoYXItbGVhZmxldAotIGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vcmV0cm9zcGVjdHByb3NwZWN0L255Yy10YXhpLXRyaXAtZHVyYXRpb24tZWRhLXRvLXhnYgotIGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vaGFtemFhc2hyYWYvc2ltcGxlLXRvLXVuZGVyc3RhbmQtZWRhLXYyCgojIyAx64uo6rOELiDrjbDsnbTthLAg7KCE7LKY66asCgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoYygnZmxleGRhc2hib2FyZCcsICdUcmFNaW5lUicsICdsZWFmbGV0JywgJ3RyZWVtYXAnLCAnaGlnaGNoYXJ0ZXInLCAnem9vJykKCiPrnbzsnbTruIzrn6zrpqwg66Gc65SpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGZsZXhkYXNoYm9hcmQpCmxpYnJhcnkoVHJhTWluZVIpCmxpYnJhcnkoaGlnaGNoYXJ0ZXIpCmxpYnJhcnkoRFQpCmxpYnJhcnkoZmxleGRhc2hib2FyZCkKbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KHJtYXJrZG93bikKbGlicmFyeSh0cmVlbWFwKQpsaWJyYXJ5KHZpcmlkaXNMaXRlKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZW9zcGhlcmUpCmxpYnJhcnkoY2FyZXQpCmxpYnJhcnkoZ2dtYXApCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KGdndGhlbWVzKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShzcCkKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoZ3JpZCkKCnJtKGxpc3Q9bHMoKSkKZmlsbENvbG9yID0gIiNmZjk5OTkiCmBgYAoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgpgYGB7cn0KdHJhaW4gPSByZWFkX2NzdigiLi9kYXRhL3RyYWluLmNzdiIpCnRlc3QgPSByZWFkX2NzdigiLi9kYXRhL3Rlc3QuY3N2IikKCnN1bShpcy5uYSh0cmFpbikpCnN1bShpcy5uYSh0ZXN0KSkKYGBgCgpgYGB7ciByZXN1bHQ9J2FzaXMnLCAgd2FybmluZz1GQUxTRX0KZ2dwbG90KGRhdGE9dHJhaW4sIGFlcyh4PSB0cmlwX2R1cmF0aW9uKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKSArCiAgc2NhbGVfeF9sb2cxMChsaW1pdHMgPSBjKE5BLDEwMDAwMCkpICsKICBzY2FsZV95X2xvZzEwKCkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNiksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTQpKSArCiAgbGFicyh4ID0gJ1RyaXAgRHVyYXRpb24nLCB5ID0gJ0NvdW50JywgdGl0bGUgPSAnVHJpcCBEdXJhdGlvbicpIApgYGAKCmBgYHtyfQpueWNEYXRhID0gc3Vic2V0KHRyYWluLHRyYWluJHRyaXBfZHVyYXRpb24gPCAoNjAqNjAqMjQpICkKCmdncGxvdChueWNEYXRhLGFlcyh4PWZhY3RvcihwYXNzZW5nZXJfY291bnQpLHk9dHJpcF9kdXJhdGlvbikpK2dlb21fYm94cGxvdCgpK3NjYWxlX3lfbG9nMTAoKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZGF0YT1ueWNEYXRhLCBhZXMoeD0gcGlja3VwX2xvbmdpdHVkZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC03NCwtNzMuODUpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCkpICsKICBsYWJzKHggPSAnTG9uZ2l0dWRlJywgeSA9ICdDb3VudCcsIHRpdGxlID0gJ0xvbmdpdHVkZScpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QoZGF0YT1ueWNEYXRhLCBhZXMoeD0gcGlja3VwX2xhdGl0dWRlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoNDAuNiw0MC44NSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTYpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE0KSkgKwogIGxhYnMoeCA9ICdMYXRpdHVkZScsIHkgPSAnQ291bnQnLCB0aXRsZSA9ICdMYXRpdHVkZScpCgpgYGAKCmBgYHtyfQpwaWNrX2Nvb3JkIDwtIG55Y0RhdGEgJT4lCiAgc2VsZWN0KHBpY2t1cF9sb25naXR1ZGUsIHBpY2t1cF9sYXRpdHVkZSkKZHJvcF9jb29yZCA8LSBueWNEYXRhICU+JQogIHNlbGVjdChkcm9wb2ZmX2xvbmdpdHVkZSwgZHJvcG9mZl9sYXRpdHVkZSkKCm55Y0RhdGEkZGlzdCA8LSBkaXN0Q29zaW5lKHBpY2tfY29vcmQsIGRyb3BfY29vcmQpIAoKbnljRGF0YSRoYXZlcnNpbmUgPC0gZGlzdEhhdmVyc2luZShwaWNrX2Nvb3JkLCBkcm9wX2Nvb3JkKQoKbnljRGF0YSRiZWFyaW5nIDwtIGJlYXJpbmcocGlja19jb29yZCwgZHJvcF9jb29yZCkgCmdncGxvdChkYXRhPW55Y0RhdGEsIGFlcyh4PSBoYXZlcnNpbmUpKSArIAogIGdlb21faGlzdG9ncmFtKCkgKwogIHNjYWxlX3hfbG9nMTAoKSArCiAgc2NhbGVfeV9sb2cxMCgpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTYpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE0KSkgKwogIGxhYnMoeCA9ICdEaXN0YW5jZScsIHkgPSAnQ291bnQnLCB0aXRsZSA9ICdEaXN0YW5jZScpCmBgYAoKYGBge3J9CmdncGxvdChueWNEYXRhKSsKICBnZW9tX3BvaW50KGFlcyh4PWhhdmVyc2luZSx5PXRyaXBfZHVyYXRpb24pKSsKICBzY2FsZV95X2xvZzEwKCkgKwogIHNjYWxlX3hfbG9nMTAoKSArCiAgdGhlbWVfYncoKSsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTYpLGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE0KSkrCiAgeGxhYigiKERpc3RhbmNlKSIpKwogIHlsYWIoIkR1cmF0aW9uIikKYGBgCgojIyBDT01CSU5JTkcgVFJBSU4gQU5EIFRFU1QKKiBjb21iaW5lIHR3byBkYXRhIHNldHMgaW50byBvbmUgdG8gcHJlcHJvY2VzcyAKCmBgYHtyfQp0cmFpbiA8LSBhcy50aWJibGUodHJhaW4pCnRlc3QgPC0gYXMudGliYmxlKHRlc3QpCgpjb21iaW5lID0gYmluZF9yb3dzKHRyYWluICU+JSBtdXRhdGUoZHNldD0idHJhaW4iKSwKICAgICAgICAgICAgICAgICAgICB0ZXN0ICU+JSBtdXRhdGUoZHNldD0idGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BvZmZfZGF0ZXRpbWU9TkEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaXBfZHVyYXRpb249TkEpKQoKY29tYmluZSA8LSBjb21iaW5lICU+JSBtdXRhdGUoZHNldCA9IGZhY3Rvcihkc2V0KSkKCnRyYWluID0gdHJhaW4gJT4lCiAgbXV0YXRlKHBpY2t1cF9kYXRldGltZSA9IHltZF9obXMocGlja3VwX2RhdGV0aW1lKSwKICAgICAgICAgZHJvcG9mZl9kYXRldGltZSA9IHltZF9obXMoZHJvcG9mZl9kYXRldGltZSksCiAgICAgICAgIHZlbmRvcl9pZCA9IGZhY3Rvcih2ZW5kb3JfaWQpLAogICAgICAgICBwYXNzZW5nZXJfY291bnQgPSBmYWN0b3IocGFzc2VuZ2VyX2NvdW50KSkKYGBgCgojIyBJTkRJVklTVUFMIEZFQVRVUkUgVklTVUFMSVpBVElPTiAK6rCBIOuzgOyImOydmCDrtoTtj6zrpbwg7Jqw7ISgIOyCtO2OtOuzuOuLpCAKCnBpY2t1cC9kcm9wb2ZmIGNvb3JkaW5hdGVzCgoqIG1hbmhhdHRhbiBvbmx5LCBKRksgaXMgYW5vdGhlciBub3RhYmxlIGhvdHNwb3QKCmBgYHtyfQpzZXQuc2VlZCgxMjM0KQpmb28gPC0gc2FtcGxlX24odHJhaW4sIDhlMykKCmxlYWZsZXQoZGF0YSA9IGZvbykgJT4lIGFkZFByb3ZpZGVyVGlsZXMoIkVzcmkuTmF0R2VvV29ybGRNYXAiKSAlPiUKICBhZGRDaXJjbGVNYXJrZXJzKH4gcGlja3VwX2xvbmdpdHVkZSwgfnBpY2t1cF9sYXRpdHVkZSwgcmFkaXVzID0gMSwKICAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsdWUiLCBmaWxsT3BhY2l0eSA9IDAuMykKCmxlYWZsZXQoZGF0YSA9IGZvbykgJT4lIGFkZFByb3ZpZGVyVGlsZXMoIkVzcmkuTmF0R2VvV29ybGRNYXAiKSAlPiUKICBhZGRDaXJjbGVNYXJrZXJzKH4gZHJvcG9mZl9sb25naXR1ZGUsIH5kcm9wb2ZmX2xhdGl0dWRlLCByYWRpdXMgPSAxLAogICAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmx1ZSIsIGZpbGxPcGFjaXR5ID0gMC4zKQoKYGBgCgp0cmlwX2R1cmF0aW9uCgoqIGxvZy1ub3JtYWwgd2l0aCBhIHBlYWsgb2YgMTAwMCBzZWNvbmRzICgyN21pbikKKiBzZXZlcmFsIHNob3J0IHJpZGVzIGxlc3MgdGhhbiAxMCBzZWMKCmBgYHtyfQp0cmFpbiAlPiUKICBnZ3Bsb3QoYWVzKHRyaXBfZHVyYXRpb24pKSArCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9ICJyZWQiLCBiaW5zID0gMTUwKSArIAogIHNjYWxlX3hfbG9nMTAoKSArCiAgc2NhbGVfeV9zcXJ0KCkKYGBgCgoqIGhvbW9nZW5lb3VzLCBjb3ZlcmluZyBiZXR3ZWVuIEphbnVhcnkgYW5kIEp1bAoqIGRyb3AgYXJvdW5kIGxhdGUgSmFudWFyeSAtIHdlYXRoZXIgCgpgYGB7ciwgZWNobz1GQUxTRX0KIyBEZWZpbmUgbXVsdGlwbGUgcGxvdCBmdW5jdGlvbgojCiMgZ2dwbG90IG9iamVjdHMgY2FuIGJlIHBhc3NlZCBpbiAuLi4sIG9yIHRvIHBsb3RsaXN0IChhcyBhIGxpc3Qgb2YgZ2dwbG90IG9iamVjdHMpCiMgLSBjb2xzOiAgIE51bWJlciBvZiBjb2x1bW5zIGluIGxheW91dAojIC0gbGF5b3V0OiBBIG1hdHJpeCBzcGVjaWZ5aW5nIHRoZSBsYXlvdXQuIElmIHByZXNlbnQsICdjb2xzJyBpcyBpZ25vcmVkLgojCiMgSWYgdGhlIGxheW91dCBpcyBzb21ldGhpbmcgbGlrZSBtYXRyaXgoYygxLDIsMywzKSwgbnJvdz0yLCBieXJvdz1UUlVFKSwKIyB0aGVuIHBsb3QgMSB3aWxsIGdvIGluIHRoZSB1cHBlciBsZWZ0LCAyIHdpbGwgZ28gaW4gdGhlIHVwcGVyIHJpZ2h0LCBhbmQKIyAzIHdpbGwgZ28gYWxsIHRoZSB3YXkgYWNyb3NzIHRoZSBib3R0b20uCiMKbXVsdGlwbG90IDwtIGZ1bmN0aW9uKC4uLiwgcGxvdGxpc3Q9TlVMTCwgZmlsZSwgY29scz0xLCBsYXlvdXQ9TlVMTCkgewoKICAjIE1ha2UgYSBsaXN0IGZyb20gdGhlIC4uLiBhcmd1bWVudHMgYW5kIHBsb3RsaXN0CiAgcGxvdHMgPC0gYyhsaXN0KC4uLiksIHBsb3RsaXN0KQoKICBudW1QbG90cyA9IGxlbmd0aChwbG90cykKCiAgIyBJZiBsYXlvdXQgaXMgTlVMTCwgdGhlbiB1c2UgJ2NvbHMnIHRvIGRldGVybWluZSBsYXlvdXQKICBpZiAoaXMubnVsbChsYXlvdXQpKSB7CiAgICAjIE1ha2UgdGhlIHBhbmVsCiAgICAjIG5jb2w6IE51bWJlciBvZiBjb2x1bW5zIG9mIHBsb3RzCiAgICAjIG5yb3c6IE51bWJlciBvZiByb3dzIG5lZWRlZCwgY2FsY3VsYXRlZCBmcm9tICMgb2YgY29scwogICAgbGF5b3V0IDwtIG1hdHJpeChzZXEoMSwgY29scyAqIGNlaWxpbmcobnVtUGxvdHMvY29scykpLAogICAgICAgICAgICAgICAgICAgIG5jb2wgPSBjb2xzLCBucm93ID0gY2VpbGluZyhudW1QbG90cy9jb2xzKSkKICB9CgogaWYgKG51bVBsb3RzPT0xKSB7CiAgICBwcmludChwbG90c1tbMV1dKQoKICB9IGVsc2UgewogICAgIyBTZXQgdXAgdGhlIHBhZ2UKICAgIGdyaWQubmV3cGFnZSgpCiAgICBwdXNoVmlld3BvcnQodmlld3BvcnQobGF5b3V0ID0gZ3JpZC5sYXlvdXQobnJvdyhsYXlvdXQpLCBuY29sKGxheW91dCkpKSkKCiAgICAjIE1ha2UgZWFjaCBwbG90LCBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbgogICAgZm9yIChpIGluIDE6bnVtUGxvdHMpIHsKICAgICAgIyBHZXQgdGhlIGksaiBtYXRyaXggcG9zaXRpb25zIG9mIHRoZSByZWdpb25zIHRoYXQgY29udGFpbiB0aGlzIHN1YnBsb3QKICAgICAgbWF0Y2hpZHggPC0gYXMuZGF0YS5mcmFtZSh3aGljaChsYXlvdXQgPT0gaSwgYXJyLmluZCA9IFRSVUUpKQoKICAgICAgcHJpbnQocGxvdHNbW2ldXSwgdnAgPSB2aWV3cG9ydChsYXlvdXQucG9zLnJvdyA9IG1hdGNoaWR4JHJvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQucG9zLmNvbCA9IG1hdGNoaWR4JGNvbCkpCiAgICB9CiAgfQp9CmBgYAoKYGBge3J9CiMgVmlldyh0cmFpbikKcDEgPC0gdHJhaW4gJT4lCiAgZ2dwbG90KGFlcyhwaWNrdXBfZGF0ZXRpbWUpKSArCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9ICJyZWQiLCBiaW5zID0gMTIwKSArCiAgbGFicyh4ID0gIlBpY2t1cCBkYXRlcyIpCgpwMiA8LSB0cmFpbiAlPiUKICBnZ3Bsb3QoYWVzKGRyb3BvZmZfZGF0ZXRpbWUpKSArCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9ICJibHVlIiwgYmlucyA9IDEyMCkgKwogIGxhYnMoeCA9ICJEcm9wb2ZmIGRhdGVzIikKCmxheW91dCA8LSBtYXRyaXgoYygxLDIpLDIsMSxieXJvdz1GQUxTRSkKbXVsdGlwbG90KHAxLCBwMiwgbGF5b3V0PWxheW91dCkKYGBgCgpgYGB7cn0KcDEgPC0gdHJhaW4gJT4lCiAgZ3JvdXBfYnkocGFzc2VuZ2VyX2NvdW50KSAlPiUKICBjb3VudCgpICU+JQogIGdncGxvdChhZXMocGFzc2VuZ2VyX2NvdW50LCBuLCBmaWxsID0gcGFzc2VuZ2VyX2NvdW50KSkgKwogIGdlb21fY29sKCkgKwogIHNjYWxlX3lfc3FydCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgpwMiA8LSB0cmFpbiAlPiUKICBnZ3Bsb3QoYWVzKHZlbmRvcl9pZCwgZmlsbCA9IHZlbmRvcl9pZCkpICsKICBnZW9tX2JhcigpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgpwMyA8LSB0cmFpbiAlPiUKICBnZ3Bsb3QoYWVzKHN0b3JlX2FuZF9md2RfZmxhZykpICsKICBnZW9tX2JhcigpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBzY2FsZV95X2xvZzEwKCkKCnA0IDwtIHRyYWluICU+JQogIG11dGF0ZSh3ZGF5ID0gd2RheShwaWNrdXBfZGF0ZXRpbWUsIGxhYmVsID0gVFJVRSkpICU+JQogIGdyb3VwX2J5KHdkYXksIHZlbmRvcl9pZCkgJT4lCiAgY291bnQoKSAlPiUKICBnZ3Bsb3QoYWVzKHdkYXksIG4sIGNvbG91ciA9IHZlbmRvcl9pZCkpICsKICBnZW9tX3BvaW50KHNpemUgPSA0KSArCiAgbGFicyh4ID0gIkRheSBvZiB0aGUgd2VlayIsIHkgPSAiVG90YWwgbnVtYmVyIG9mIHBpY2t1cHMiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKcDUgPC0gdHJhaW4gJT4lCiAgbXV0YXRlKGhwaWNrID0gaG91cihwaWNrdXBfZGF0ZXRpbWUpKSAlPiUKICBncm91cF9ieShocGljaywgdmVuZG9yX2lkKSAlPiUKICBjb3VudCgpICU+JQogIGdncGxvdChhZXMoaHBpY2ssIG4sIGNvbG9yID0gdmVuZG9yX2lkKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsKICBsYWJzKHggPSAiSG91ciBvZiB0aGUgZGF5IiwgeSA9ICJUb3RhbCBudW1iZXIgb2YgcGlja3VwcyIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgpsYXlvdXQgPC0gbWF0cml4KGMoMSwyLDMsNCw1LDUpLDMsMixieXJvdz1UUlVFKQptdWx0aXBsb3QocDEsIHAyLCBwMywgcDQsIHA1LCBsYXlvdXQ9bGF5b3V0KQpgYGAKCmBgYHtyfQpwMSA8LSB0cmFpbiAlPiUKICBtdXRhdGUoaHBpY2sgPSBob3VyKHBpY2t1cF9kYXRldGltZSksCiAgICAgICAgIE1vbnRoID0gZmFjdG9yKG1vbnRoKHBpY2t1cF9kYXRldGltZSwgbGFiZWwgPSBUUlVFKSkpICU+JQogIGdyb3VwX2J5KGhwaWNrLCBNb250aCkgJT4lCiAgY291bnQoKSAlPiUKICBnZ3Bsb3QoYWVzKGhwaWNrLCBuLCBjb2xvciA9IE1vbnRoKSkgKwogIGdlb21fbGluZShzaXplID0gMS41KSArCiAgbGFicyh4ID0gIkhvdXIgb2YgdGhlIGRheSIsIHkgPSAiY291bnQiKQoKcDIgPC0gdHJhaW4gJT4lCiAgbXV0YXRlKGhwaWNrID0gaG91cihwaWNrdXBfZGF0ZXRpbWUpLAogICAgICAgICB3ZGF5ID0gZmFjdG9yKHdkYXkocGlja3VwX2RhdGV0aW1lLCBsYWJlbCA9IFRSVUUpKSkgJT4lCiAgZ3JvdXBfYnkoaHBpY2ssIHdkYXkpICU+JQogIGNvdW50KCkgJT4lCiAgZ2dwbG90KGFlcyhocGljaywgbiwgY29sb3IgPSB3ZGF5KSkgKwogIGdlb21fbGluZShzaXplID0gMS41KSArCiAgbGFicyh4ID0gIkhvdXIgb2YgdGhlIGRheSIsIHkgPSAiY291bnQiKQoKbGF5b3V0IDwtIG1hdHJpeChjKDEsMiksMiwxLGJ5cm93PUZBTFNFKQptdWx0aXBsb3QocDEsIHAyLCBsYXlvdXQ9bGF5b3V0KQpgYGAKCiogMSDsm5Tqs7wgNiDsm5TsnYAg7Jes7ZaJIO2an+yImOqwgCDsoIHsp4Drp4wgMyDsm5Tqs7wgNCDsm5TsnYAg67CU7IGcIOuLrOyeheuLiOuLpC4KKiDso7zrp5AgKO2GoOyalOydvOqzvCDsnbzsmpTsnbwsIO2UjOufrOyKpOyXkOyEnCDsl7DsnqXquYzsp4ApIOydtOuluCDslYTsuajsl5DripQg642UIOuGkuydgCDsl6ztlokg7Iir7J6Q66W8IOqwluyngOunjCDsmKTsoITsl5DripQgNeyLnOyXkOyEnCAxMCDsi5zquYwg7KeAIOuCruyKteuLiOuLpAoKIyMgRkVBVFVSRSBSRUxBVElPTlMgClBpY2t1cCBkYXRlL3RpbWUgdnMgdHJpcF9kdXJhdGlvbgpgYGB7cn0KcDEgPC0gdHJhaW4gJT4lCiAgbXV0YXRlKHdkYXkgPSB3ZGF5KHBpY2t1cF9kYXRldGltZSwgbGFiZWwgPSBUUlVFKSkgJT4lCiAgZ3JvdXBfYnkod2RheSwgdmVuZG9yX2lkKSAlPiUKICBzdW1tYXJpc2UobWVkaWFuX2R1cmF0aW9uID0gbWVkaWFuKHRyaXBfZHVyYXRpb24pLzYwKSAlPiUKICBnZ3Bsb3QoYWVzKHdkYXksIG1lZGlhbl9kdXJhdGlvbiwgY29sb3IgPSB2ZW5kb3JfaWQpKSArCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKwogIGxhYnMoeCA9ICJEYXkgb2YgdGhlIHdlZWsiLCB5ID0gIk1lZGlhbiB0cmlwIGR1cmF0aW9uIFttaW5dIikKCnAyIDwtIHRyYWluICU+JQogIG11dGF0ZShocGljayA9IGhvdXIocGlja3VwX2RhdGV0aW1lKSkgJT4lCiAgZ3JvdXBfYnkoaHBpY2ssIHZlbmRvcl9pZCkgJT4lCiAgc3VtbWFyaXNlKG1lZGlhbl9kdXJhdGlvbiA9IG1lZGlhbih0cmlwX2R1cmF0aW9uKS82MCkgJT4lCiAgZ2dwbG90KGFlcyhocGljaywgbWVkaWFuX2R1cmF0aW9uLCBjb2xvciA9IHZlbmRvcl9pZCkpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzcGFuID0gMS8yKSArCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKwogIGxhYnMoeCA9ICJIb3VyIG9mIHRoZSBkYXkiLCB5ID0gIk1lZGlhbiB0cmlwIGR1cmF0aW9uIFttaW5dIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKCmxheW91dCA8LSBtYXRyaXgoYygxLDIpLDIsMSxieXJvdz1GQUxTRSkKbXVsdGlwbG90KHAxLCBwMiwgbGF5b3V0PWxheW91dCkKYGBgCgoKKiDrjZQg7J6Q7KO8IOyXrO2Wie2VmOuKlCDrsqTrjZQgMuuKlCDsp4Dsho3soIHsnLzroZwg642UIOuGkuydgCDsl6ztlokg6riw6rCE7J2EIOqwgOynkeuLiOuLpC4KKiDsnbTrpbgg7Jik7ZuE7J2YIOy1nOqzoOygkOqzvCA1LTZhbeyZgCA4cG0g7KO87JyE7JeQIGRpcHMuCgojIyBQYXNzZW5nZXIgY291bnQgYW5kIFZlbmRvciB2cyB0cmlwX2R1cmF0aW9uCgpgYGB7cn0KdHJhaW4gJT4lCiAgZ2dwbG90KGFlcyh0cmlwX2R1cmF0aW9uLCBmaWxsID0gdmVuZG9yX2lkKSkgKwogIGdlb21fZGVuc2l0eShwb3NpdGlvbiA9ICJzdGFjayIpICsKICBzY2FsZV94X2xvZzEwKCkKCnRyYWluICU+JQogIGdyb3VwX2J5KHZlbmRvcl9pZCkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZHVyYXRpb24gPSBtZWFuKHRyaXBfZHVyYXRpb24pLAogICAgICAgICAgICBtZWRpYW5fZHVyYXRpb24gPSBtZWRpYW4odHJpcF9kdXJhdGlvbikpCmBgYAoKKiDspJHslZnqsJLsnYAg66ek7JqwIOycoOyCrO2VmOyngOunjCwg7Y+J6reg6rCS7J20IOq4tCDquLDqsITsnZgg64yA67aA67aE7J2EIO2PrO2VqO2VmOuKlCDrsqTrjZQgMuyXkCDsnZjtlbQg7Y+J6reg6rCS7J20IOu5hOuapOyWtCDsp4gg6rCA64ql7ISx7J20IOyeiOyKteuLiOuLpAoKIyMgRmVhdHVyZSBFbmdpbmVlcmluZwotIO2UveyXhSDrsI8g65Oc66GtIOyYpO2UhCDsnITsuZgg7IKs7J207J2YIOqxsOumrCAo7YKs66Gc66+47YSwKQotIO2UveyXhSDtj6zsnbjtirjsmYAg65Oc66GtIOyYpO2UhCDtj6zsnbjtirjsnZgg7KKM7ZGc66Gc67aA7YSwIOuRkCDsoJAg7IKs7J207J2YIOqxsOumrOulvCDqs4TsgrDtlaAg7IiYIOyeiOyKteuLiOuLpC4gCgotIOydtCDqsbDrpqzrpbwg6rOE7IKw7ZWY6riwIOychO2VtCDsmrDrpqzripQg7KeA6rWs6raMIO2MqO2CpOyngOydmCBkaXN0SGF2ZXJzaW5lIO2VqOyImOulvCDsgqzsmqntlZjqs6Ag7J6I7Iq164uI64ukLiDsnbQg67Cp67KV7J2AIOq1rO2YlSDsp4DqtazsnZgg65GQIOygkCDsgqzsnbTsnZgg7LWc64uoIOqxsOumrOulvCDsoJzqs7Xtlanri4jri6QuCgpgYGB7cn0KdHJhaW4gPSBhcy5kYXRhLnRhYmxlKHRyYWluKQoKdHJhaW4gPC0gdHJhaW5bLGRpc3RhbmNlX2ttIDo9IAogICAgICAgICAgICAgICAgICAgICBkaXN0SGF2ZXJzaW5lKG1hdHJpeChjKHBpY2t1cF9sb25naXR1ZGUsIHBpY2t1cF9sYXRpdHVkZSksIG5jb2wgPSAyKSwKICAgICAgICAgICAgICAgICAgICAgbWF0cml4KGMoZHJvcG9mZl9sb25naXR1ZGUsZHJvcG9mZl9sYXRpdHVkZSksIG5jb2wgPSAyKSkvMTAwMAogICAgICAgICAgICAgIF0KdHJhaW4gJT4lIAogIGdncGxvdChhZXMoeD1kaXN0YW5jZV9rbSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucz00MDAwLCBmaWxsPSJyZWQiKSsKICB0aGVtZV9idygpK3RoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSksYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9OCkpKwogIHlsYWIoIkRlbnNpdHkiKStjb29yZF9jYXJ0ZXNpYW4oeD1jKDAsMjUpKQpgYGAKCi0g7YWM7Iqk7Yq4IOyGjeuPhOuKlCDthYzsiqTtirgg642w7J207YSwIOyEuO2KuOyXkOyEnCDsgqzsmqntlaAg7IiYIOyXhuyKteuLiOuLpC4g6re465+s64KYIOq3uOqyg+ydgCDslrTrlqQg7KKF66WY7J2YIO2MqO2EtOydtCDtirjrnpjtlL3sl5Ag7J6I64qU7KeA66W8IOuztOuKlCDqsoPsnYQg64+E7Jq4IOyImCDsnojsirXri4jri6QuCgpgYGB7cn0KdHJhaW5bLHNwZWVkOj0oZGlzdGFuY2Vfa20pLyh0cmlwX2R1cmF0aW9uLzM2MDApXQoKdHJhaW4gJT4lIAogIGdncGxvdChhZXMoeD1zcGVlZCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucz00MDAwLCBmaWxsPSJyZWQiKSsKICB0aGVtZV9idygpK3RoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMSksYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9OCkpKwogIHlsYWIoIkRlbnNpdHkiKStjb29yZF9jYXJ0ZXNpYW4oeD1jKDAsNTApKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KHRyYWluJHNwZWVkKQpgYGAKCi0gOTI4NWttIC8gaCDsho3rj4TsnZgg7Yq57KCVIHJpZGVz6rCAIOyeiOyKteuLiOuLpC4g7Jqw66as64qUIOydtOyDgSDsuZgg67aE7ISdIChPdXRsaWVyIEFuYWx5c2lzKSDrtoDrtoTsl5DshJwg7J2066W8IOyhsOyCrCDtlaAg6rKD7J6F64uI64ukLiDqt7jrn6zrgpgg7Y+J6regIOyGjeuPhOuKlCAxNWttIC8gaOyeheuLiOuLpC4gCgpgYGB7ciwgZWNobz1UUlVFfQp0cmFpbiRwaWNrdXBfaG91ciA8LSBob3VyKHRyYWluJHBpY2t1cF9kYXRldGltZSkKdHJhaW4kcGlja3VwX3dlZWsgPC0gd2Vlayh0cmFpbiRwaWNrdXBfZGF0ZXRpbWUpCnRyYWluJHBpY2t1cF9tb250aCA8LSBtb250aCh0cmFpbiRwaWNrdXBfZGF0ZXRpbWUpCnRyYWluJHBpY2t1cF93ZWVrZGF5cyA8LSB3ZWVrZGF5cyh0cmFpbiRwaWNrdXBfZGF0ZXRpbWUpCnRyYWluJHBpY2t1cF93ZWVrZW5kIDwtIGlmZWxzZSh0cmFpbiRwaWNrdXBfd2Vla2RheXM9PTEgfCB0cmFpbiRwaWNrdXBfd2Vla2RheXM9PTcsIldlZWtlbmQiLCJub3QtV2Vla2VuZCIpCgp0cmFpblsscGlja3VwX2RhdGV0aW1lOj1hcy5EYXRlKHBpY2t1cF9kYXRldGltZSldCnRyYWluWyxkcm9wb2ZmX2RhdGV0aW1lOj1hcy5EYXRlKGRyb3BvZmZfZGF0ZXRpbWUpXQoKdHJhaW5bLCI6PSIoCiAgIHBpY2t1cF95ZGF5PXlkYXkocGlja3VwX2RhdGV0aW1lKQogICxwaWNrdXBfbWRheT1tZGF5KHBpY2t1cF9kYXRldGltZSkKKV0KCnRyYWluICU+JSAKICBncm91cF9ieShwaWNrdXBfaG91cikgJT4lIAogIHN1bW1hcml6ZShtZWFuX3NwZWVkID0gbWVhbihzcGVlZCksbigpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PXBpY2t1cF9ob3VyLHk9bWVhbl9zcGVlZCkpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsb2VzcycsY29sb3I9ImdyZXkxMCIpKwogIGdlb21fcG9pbnQoY29sb3I9InJlZCIpK2Nvb3JkX2NhcnRlc2lhbih5bGltPWMoMTAsMjUpKSt0aGVtZV9idygpCmBgYAoKLSDtlZjro6gg7Y+J6regIOyGjeuPhOqwgCDsg4Hri7ntnogg64Ku7Iq164uI64ukLiDrtoTrqoXtnogg7Yq4656Y7ZS97J20IOunjuq4sCDrlYzrrLjsnoXri4jri6QuCgojIyBGZWF0dXJlIFZpc3VhbGlzYXRpb24KCmBgYHtyfQpsaWJyYXJ5KGNvcnJwbG90KQpjb3JyX2ZlYXR1cmVzID0gdHJhaW5bLC4ocGlja3VwX2hvdXIsIHBpY2t1cF93ZWVrLCBwaWNrdXBfbW9udGgscGlja3VwX3lkYXksIHBpY2t1cF9tZGF5LHBhc3Nlbmdlcl9jb3VudCx0cmlwX2R1cmF0aW9uLGRpc3RhbmNlX2ttKV0KCmNvcnJwbG90KGNvcihjb3JyX2ZlYXR1cmVzLCB1c2U9J2NvbXBsZXRlLm9icycpLCB0eXBlPSdsb3dlcicpCmBgYAoKLSDrs4DsiJjsnZgg7Ja064qQIOqyg+uPhCB0cmlwX2R1cmF0aW9u6rO8IOyDgeq0gCDqtIDqs4TqsIAg7JeG6riwIOuVjOusuOyXkCDsnbTqsoPsnYAg66ek7JqwIOu2iOyViOygle2VnCDqtazshLHsnoXri4jri6QuIAoKLSDqsbDrpqzqsIAg7IOB6rSAIOq0gOqzhOqwgOyeiOuKlCDsnKDsnbztlZwg6rGw66as7J207KeA66eMIO2FjOyKpO2KuCDshLjtirjsl5DripQg7ZW064u5IOq4sOuKpeydtCDsl4bsirXri4jri6QuIOq4sOuKpeydmCDsnbzrtoDqsIAg64yA7IOBIOuzgOyImOyZgCDsg4HtmLgg7Jew6rSAIOuQoCDsiJjrj4Qg7J6I7KeA66eMIOyhsOyCrO2VtOyVvO2VqeuLiOuLpC4gCgotIO2UvOyzkOyZgCDtg4Dqsp8g67OA7IiY6rCE7JeQIOyDgeq0gCDqtIDqs4TqsIAg7JeG64uk64qUIOqyg+ydgCDtirjrpr0g7Iuc6rCE7J2EIOyYiOy4oe2VmOq4sCDsnITtlbQg7Jm467aAIO2UvOyzkOulvCDssL7slYTslbztlZzri6TripQg6rKD7J2EIOydmOuvuO2VqeuLiOuLpC4KCmBgYHtyfQpwbG90MSA8LXRyYWluWywgbGlzdChtZWFuX3RyaXBfZHVyYXRpb24gPSBtZWFuKHRyaXBfZHVyYXRpb24pKSwgYnkgPSBwaWNrdXBfd2Vla2RheXNdICU+JQogIGdncGxvdChhZXMoeCA9IHBpY2t1cF93ZWVrZGF5cywgeSA9IG1lYW5fdHJpcF9kdXJhdGlvbikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JywgZmlsbCA9ICdzdGVlbGJsdWUnKSArCiAgbGFicyh4ID0gJ01vbnRoJywgeSA9ICdNZWFuIFRyaXAgRHVyYXRpb24nLCB0aXRsZSA9ICdNZWFuIFRyaXAgZHVyYXRpb24gYnkgd2Vla2RheXMnKQoKZ3JpZC5hcnJhbmdlKHBsb3QxKQpgYGAKCmBgYHtyfQpwbG90MSA8LXRyYWluWywgbGlzdChtZWFuX3RyaXBfZHVyYXRpb24gPSBtZWFuKHRyaXBfZHVyYXRpb24pKSwgYnkgPSBwaWNrdXBfaG91cl0gJT4lCiAgZ2dwbG90KGFlcyh4ID0gYXMuZmFjdG9yKHBpY2t1cF9ob3VyKSwgeSA9IG1lYW5fdHJpcF9kdXJhdGlvbikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JywgZmlsbCA9ICdzdGVlbGJsdWUnKSArCiAgbGFicyh4ID0gJ0hvdXJzJywgeSA9ICdNZWFuIFRyaXAgRHVyYXRpb24nLCB0aXRsZSA9ICdNZWFuIFRyaXAgZHVyYXRpb24gYnkgaG91ciBvZiB0aGUgZGF5JykKCnBsb3QyID0gdHJhaW5bLC5OLCBieT1waWNrdXBfaG91cl0gJT4lCiAgZ2dwbG90KGFlcyh4PXBpY2t1cF9ob3VyLCB5PU4pKSArIAogIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JywgZmlsbD0nc3RlZWxibHVlJykgKyAKICBsYWJzKHg9JycsIHk9J051bWJlciBvZiBSaWRlcycsIHRpdGxlPSdUb3RhbCBSaWRlcyBQZXIgSG91cicpCgpncmlkLmFycmFuZ2UocGxvdDEsIHBsb3QyLCBuY29sID0yKQpgYGAKCiMjIEV4dGVybmFsIERhdGEKLSBGYXN0ZXN0IFJvdXRlcwpbb3NjYXJsZW9dKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vb3NjYXJsZW8pIE9wZW4gc291cmNlIFJvdXRpbmcgTWFjaGluZShbT1NSTV0oaHR0cDovL3Byb2plY3Qtb3NybS5vcmcvKSkKCi0gT3BlbiBTb3VyY2UgUm91dGluZyBNYWNoaW5lLCBPU1JN7J2EIOyCrOyaqe2VmOyXrCBvc2Nhcmxlb+qwgCDsnKDsmqntlZwg642w7J207YSwIOyEuO2KuOulvCDsoJzqs7Xtlanri4jri6QuIAoKLSDtlL3sl4Xsl5DshJwg65Oc66GtIOyYpO2UhCDsnITsuZjquYzsp4DsnZgg6rCA7J6lIOu5oOuluCDqsr3roZzsmYAg7ZW064u5IOyLnOqwhC4K6rCA7J6lIOu5oOuluCDrhbjshKDsnYTsnITtlZwg6rGw66as7J2YIOyImC4KCi0g7JiI66W8IOuTpOyWtCDqs6Dsho3rj4TroZwg7KeE7J6F6rO8IOqwmeydgCDsl6ztlokg64u5IOq4sOuPmSDsiJguCi0g7JiI66W8IOuTpOyWtCDsooztmozsoITsnbTrgpgg7Jqw7ZqM7KCE6rO8IOqwmeydgCDsl6ztlokg64u5IOq4uCDssL7quLAuCgpgYGB7cn0Kc3VwcHJlc3NNZXNzYWdlcyh7CmZhc3Rlc3Rfcm91dGVfdHJhaW4gPSByZWFkX2NzdigiLi9kYXRhL25ldy15b3JrLWNpdHktdGF4aS13aXRoLW9zcm0vZmFzdGVzdF9yb3V0ZXNfdHJhaW5fcGFydF8xLmNzdiIpCn0pCmR0cmFpbiA9IG1lcmdlKHRyYWluLCBmYXN0ZXN0X3JvdXRlX3RyYWluLCBieT0iaWQiKQoKZHRyYWluWyxudW1iZXJfb2Zfc3RyZWV0cyA6PSBudW1iZXJfb2Zfc3RlcHMgLSAxXQpwbG90MSA8LSAKICBkdHJhaW5bLCBsaXN0KG1lYW5fdHJpcF9kdXJhdGlvbiA9IG1lYW4odG90YWxfdHJhdmVsX3RpbWUpKSwgYnkgPSBudW1iZXJfb2Zfc3RyZWV0c10gJT4lCiAgZ2dwbG90KGFlcyh4ID0gYXMuZmFjdG9yKG51bWJlcl9vZl9zdHJlZXRzKSwgeSA9IG1lYW5fdHJpcF9kdXJhdGlvbikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JywgZmlsbCA9ICdzdGVlbGJsdWUnKSArCiAgbGFicyh4ID0gJ051bWJlciBvZiBTdHJlZXRzJywgeSA9ICdNZWFuIFRyaXAgRHVyYXRpb24nLCB0aXRsZSA9ICdNZWFuIFRyaXAgZHVyYXRpb24gYnkgTnVtYmVyIG9mIFN0cmVldHMnKQoKcGxvdDIgPC0gZHRyYWluWywgbGlzdChOdW1iZXJfb2ZfUmlkZXMgPSAuTiksIGJ5ID0gbnVtYmVyX29mX3N0cmVldHNdICU+JQogIGdncGxvdChhZXMoeCA9IGFzLmZhY3RvcihudW1iZXJfb2Zfc3RyZWV0cyksIHkgPSBOdW1iZXJfb2ZfUmlkZXMpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScsIGZpbGwgPSAnc3RlZWxibHVlJykgKwogIGxhYnMoeCA9ICdOdW1iZXIgb2YgU3RyZWV0cycsIHkgPSAnTnVtYmVyIG9mIFRyaXBzJywgdGl0bGUgPSAnTnVtYmVyIG9mIFJpZGVzIGJ5IE51bWJlciBvZiBTdHJlZXRzJykKCnBsb3QzIDwtIGR0cmFpblssIGxpc3QobWVhbl9kaXN0YW5jZSA9IG1lYW4odG90YWxfZGlzdGFuY2UpLzEwMDApLCBieSA9IG51bWJlcl9vZl9zdHJlZXRzXSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhcy5mYWN0b3IobnVtYmVyX29mX3N0cmVldHMpLCB5ID0gbWVhbl9kaXN0YW5jZSkpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JywgZmlsbCA9ICdzdGVlbGJsdWUnKSArCiAgbGFicyh4ID0gJ051bWJlciBvZiBTdHJlZXRzJywgeSA9ICdNZWFuIFRyaXAgRGlzdG5hY2Uoa20pJywgdGl0bGUgPSAnTWVhbiBUcmlwIERpc3RhbmNlIGJ5IE51bWJlciBvZiBTdHJlZXRzJykKCmdyaWQuYXJyYW5nZShwbG90MSxwbG90MiwgcGxvdDMpCmBgYAoKLSDrqocg6rCA7KeAIOuNlCDtmZXsnbjtlZjqs6Ag7Iu27Iq164uI64ukLiDsmIjrpbwg65Ok7Ja0IOyLpOygnCDsl6ztlokg7Iuc6rCE6rO8IOqwgOyepSDruaDrpbgg6rK966GcIOyCrOydtOydmCDsi5zqsIQg7LCo7J206rCAIOyWvOuniOuCmCDtgbDsp4Drpbwg7JiI66GcIOuTpCDsiJgg7J6I7Iq164uI64ukLgoKYGBge3J9CnBsb3QxIDwtIGR0cmFpbiAlPiUKICBnZ3Bsb3QoYWVzKHRyaXBfZHVyYXRpb24pKSArCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAicmVkIiwgYWxwaGEgPSAwLjUpICsKICBnZW9tX2RlbnNpdHkoYWVzKHRvdGFsX3RyYXZlbF90aW1lKSwgZmlsbCA9ICJibHVlIiwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV94X2xvZzEwKCkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYyg1ZTEsIDhlMykpCgpkdHJhaW5bLGRpZmY6PSBhYnModHJpcF9kdXJhdGlvbi10b3RhbF90cmF2ZWxfdGltZSldCgpkdHJhaW5bLG51bWJlcl9vZl9zdGVwczo9IGlmZWxzZShudW1iZXJfb2Zfc3RlcHM+PSAyNSwgMjUsIG51bWJlcl9vZl9zdGVwcyldCgpwbG90MiA9ICBkdHJhaW5bLCBsaXN0KG1lYW5fZGlzdGFuY2Vfa20gPSBtZWFuKGRpZmYpKSwgYnk9bnVtYmVyX29mX3N0ZXBzLTFdICU+JQogIGdncGxvdChhZXMoeD1udW1iZXJfb2Zfc3RlcHMsIHk9bWVhbl9kaXN0YW5jZV9rbSkpICsgCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCBmaWxsPSdzdGVlbGJsdWUnKSArIAogIGxhYnMoeD0nTnVtYmVyIG9mIFN0cmVldHMnLCB5PSd8VHJpcER1cmF0aW9uIC0gVG90YWxUcmF2ZWxUaW1lKXwnKQoKZ3JpZC5hcnJhbmdlKHBsb3QxLCBwbG90MiwgbmNvbD0yKQpgYGAKCgotIO2MjOuegOyDiSDqt7jrprzsnYAg6rCA7J6lIOu5oOuluCDqsr3roZwg67CA64+EIOq3uOumvOyeheuLiOuLpC4g7Iuk7KCcIOyXrO2WiSDsi5zqsITqs7wg67mE7Iq37ZWY7KeA66eMIOq1kOuMgOuhnCDrs7TsnoXri4jri6QuCgotIOuRkCDrsojsp7gg7ZSM66Gv7JeQ7IScIOyasOumrOuKlCDsi6TsoJwg7J2064+Z65+J6rO8IOqwgOyepSDruaDrpbgg6rK966GcIOyLnOqwhCDqsITsnZgg7KCI64yA7KCB7J24IOywqOydtOqwgCDqsbDrpqzsnZgg7IiY6rCAIOymneqwgO2VqOyXkCDrlLDrnbwg7Kad6rCA7ZWc64uk64qUIOqyg+ydhCDqtIDssLDtlanri4jri6QuIAoKLSDsmKTripjrgqDsnZgg6rCA7J6lIOu5oOuluCDqsr3roZzqsIAg6rO86rGw7J2YIOyLpOygnCDqsr3roZzsmYAg64uk66W4IO2ZleuloOydtCDri6jqs4Qg7Kad6rCA7J2YIOyImOuhnCDspp3qsIDtlZjquLAg65WM66y47JeQIOuFvOumrOyggeyeheuLiOuLpC4KCi0g6rCA7J6lIOu5oOuluCDqsr3roZwg642w7J207YSw66W8IOyCrOyaqe2VmOyXrCDsi6TsoJwg6rK966Gc7JeQIOuMgO2VtCDsnZjrr7jsnojripQg6rKD7J2EIOunkO2VmOuKlCDrsKnrspXsnYQg7J207ZW07ZWY64qUIOqyg+ydgCDsoJXrp5Ag7Ja066C17Iq164uI64ukLiDsmKTripgg6rCA7J6lIOu5oOuluCDquLjsnYAg64K07J28IOuYkOuKlCDqs7zqsbDsnZgg6rCA7J6lIOu5oOuluCDquLjsnbQg7JWE64uI6riwIOuVjOusuOyXkC4gCgotIOuUsOudvOyEnCDtm4jroKgg7IS47Yq47J2YIOqyveuhnOuKlCBPU1JN7JeQ7IScIOygnOyViO2VnCDqsr3roZzsmYAg64uk66aF64uI64ukLiDrgrTqsIAg6rCA7J6lIOuLpOuluCDsoJDsnYAg6rCA7J6lIOu5oOuluCDqsr3roZzsmYAg6rSA66Co65CcIOq4sOuKpeydtCDtm4jroKgg7IS47Yq47J2YIHJpZGVz7JeQIOuMgO2VtOuzhOuhnCDrp5DtlZjsp4Ag7JWK64qU64uk64qUIOqyg+yeheuLiOuLpC4KCiMjIEdvb2dsZSBEaXN0YW5jZSBNYXRyaXgKCi0g7J20IOuNsOydtO2EsCDshLjtirjripQgRGViYW5qYW7snbQgR29vZ2xlIE1hcHMgQVBJ66W8IOyCrOyaqe2VmOyXrCDsoJzqs7Xtlanri4jri6QuIAoKLSDsoIHslrTrj4Qg7J20IOuMgO2ajOydmCDrqqjrk6Ag65287J2065Sp7JeQIOyCrOyaqe2VoCDsiJjsnojripQg642w7J207YSw6rCAIOyeiOuLpOuptCDrp47snYAg6rKD7J2EIOyVveyGje2VqeuLiOuLpC4gCgotIOuNsOydtO2EsOuKlCDtm4jroKgg7IS47Yq47J2YIO2VmOychCDsp5Htlansl5Ag64yA7ZW07ISc66eMIOygnOqzteuQmOuvgOuhnCDrgpjrqLjsp4Ag642w7J207YSw64qUIOyeoOq5kCDquLDri6Trpqzqs6Ag7J6I7Iq164uI64ukLiDsnbQg642w7J207YSwIOyEuO2KuOydmCDspJHsmpTtlZwg7KCV67O064qUIEdvb2dsZSDquLDqsITsnbTrnbzripQg65GQIOychOy5mCDqsITsnZgg6rO86rGwIO2Pieq3oCDsp4Dsho0g7Iuc6rCE7J6F64uI64ukLiAKCi0g64KY64qUIEdvb2dsZSDquLDqsITqs7wg7Iuk7KCcIOq4sOqwhOydmCDssKjsnbTroZwg7IOI66Gc7Jq0IOq4sOuKpeydhCDrp4zrk6TslrQg64K8IOqyg+yeheuLiOuLpC4g7LCo7J206rCAICfsp4Dsl7An67O064ukICcwJ+uztOuLpCDsnpHsnLzrqbQgJ+y0iOq4sCDrj4TssKkn7J20IOyeiOyKteuLiOuLpC4KCmBgYHtyfQpzdXBwcmVzc01lc3NhZ2VzKHsKZ29vZ2xlX2Rpc3QgPSByZWFkX2NzdigiLi9kYXRhL25ldy15b3JrLWNpdHktdGF4aS13aXRoLW9zcm0vdHJhaW5fZGlzdGFuY2VfbWF0cml4LmNzdiIpCn0pCgpnb29nbGVfZGlzdCA9IGRhdGEudGFibGUoZ29vZ2xlX2Rpc3QpCmdvb2dsZV9kaXN0WywgZGlmZiA6PSBnb29nbGVfZHVyYXRpb24tdHJpcF9kdXJhdGlvbl0KCnBsb3QxIDwtIGdvb2dsZV9kaXN0ICU+JQogIGdncGxvdChhZXModHJpcF9kdXJhdGlvbikpICsKICBnZW9tX2RlbnNpdHkoZmlsbCA9ICJyZWQiLCBhbHBoYSA9IDAuNSkgKwogIGdlb21fZGVuc2l0eShhZXMoZ29vZ2xlX2R1cmF0aW9uKSwgZmlsbCA9ICJibHVlIiwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV94X2xvZzEwKCkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYyg1ZTEsIDhlMykpCgoKcGxvdDIgPSBnb29nbGVfZGlzdCAlPiUgCiAgZ2dwbG90KGFlcyh4PWRpZmYpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbnM9MjAwMDAsIGZpbGw9InJlZCIpKwogIHRoZW1lX2J3KCkrdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSxheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpKwogIHlsYWIoIkRlbnNpdHkiKStjb29yZF9jYXJ0ZXNpYW4oeD1jKC0yMDAwLDIwMDApKQoKZ3JpZC5hcnJhbmdlKHBsb3QxLCBwbG90MiwgbmNvbD0yKQpgYGAKCi0g7YyM656A7IOJIOykhOqxsOumrOuKlCBHb29nbGUg6riw6rCE7J2066mwIOu5qOqwhOyDieydgCDsi6TsoJwg7KeA7IaNIOyLnOqwhOyeheuLiOuLpC4gCgotIEdvb2dsZSDquLDqsITsnbQg642UIOu5hOuapOyWtOyhjOyKteuLiOuLpC4g7Iuk7KCcIOyngOyGjSDsi5zqsITsnYAg642UIOuGkuydgCDrtoTsgrAgKOuNlCDrtoDtkoDslrQg7Jik66W4KeqzvCDrjZQg65GQ6rq87Jq0IOq8rOumrOulvOqwgOynkeuLiOuLpC4KCi0g65GQIOuyiOynuCDtlIzroa/snYAgR29vZ2xlIOq4sOqwhOqzvCDsi6TsoJwg6riw6rCEIOqwhOydmCDsi5zqsIQg7LCo7J207JeQIOuMgO2VnCDrp4nrjIAg6re4656Y7ZSE7J6F64uI64ukLiAKCi0g7Jm87Kq967O064ukIDDsnZgg7Jik66W47Kq97JeQIOuNlCDrp47snYAg6rSA7Lih7J20IOyeiOuLpOuKlCDqsoPsnYQg6rSA7LCwIO2VoCDsiJgg7J6I7Iq164uI64ukLiDspoksICfsp4Dsl7An67O064ukICfsobDquLAg64+E7LCpJ+ydtCDrjZQg66eO7J2AICdyaWRlcyfqsIAg7J6I7Iq164uI64ukLiAKCiMjIFdlYXRoZXIgRGF0YQoKYGBge3J9CndlYXRoZXIgPSBmcmVhZCgiLi9kYXRhL25ldy15b3JrLWNpdHktdGF4aS13aXRoLW9zcm0vd2VhdGhlcl9kYXRhX255Y19jZW50cmFscGFya18yMDE2LmNzdiIpCndlYXRoZXIgPC0gd2VhdGhlciAlPiUKICBtdXRhdGUoZGF0ZSA9IGRteShkYXRlKSwKICAgICAgICAgcmFpbiA9IGFzLm51bWVyaWMoaWZlbHNlKHByZWNpcGl0YXRpb24gPT0gIlQiLCAiMC4wMSIsIHByZWNpcGl0YXRpb24pKSwKICAgICAgICAgc19mYWxsID0gYXMubnVtZXJpYyhpZmVsc2UoYHNub3cgZmFsbGAgPT0gIlQiLCAiMC4wMSIsIGBzbm93IGZhbGxgKSksCiAgICAgICAgIHNfZGVwdGggPSBhcy5udW1lcmljKGlmZWxzZShgc25vdyBkZXB0aGAgPT0gIlQiLCAiMC4wMSIsIGBzbm93IGRlcHRoYCkpLAogICAgICAgICBhbGxfcHJlY2lwID0gc19mYWxsICsgcmFpbiwKICAgICAgICAgaGFzX3Nub3cgPSAoc19mYWxsID4gMCkgfCAoc19kZXB0aCA+IDApLAogICAgICAgICBoYXNfcmFpbiA9IHJhaW4gPiAwLAogICAgICAgICBtYXhfdGVtcCA9IGBtYXhpbXVtIHRlbWVyYXR1cmVgLAogICAgICAgICBtaW5fdGVtcCA9IGBtaW5pbXVtIHRlbXBlcmF0dXJlYCkKCgp3ZWF0aGVyID0gYXMuZGF0YS50YWJsZSh3ZWF0aGVyKQp3ZWF0aGVyWywgYygicHJlY2lwaXRhdGlvbiIsICJzbm93IGZhbGwiLCAic25vdyBkZXB0aCIsICJtYXhpbXVtIHRlbWVyYXR1cmUiLCAibWluaW11bSB0ZW1wZXJhdHVyZSIpIDo9IE5VTExdCgpzZXRrZXkoZHRyYWluLCBkcm9wb2ZmX2RhdGV0aW1lKQpzZXRrZXkod2VhdGhlciwgZGF0ZSkKCmR0cmFpbiA9IHdlYXRoZXJbZHRyYWluXQpgYGAKCi0g64Kg7JSo6rCAIOuRkCDqsIDsp4Ag67Cp67KV7Jy866GcIOyXrO2WiSDsi5zqsITsl5Ag7JiB7Zal7J2EIOuvuOy5nOuLpOqzoCDsg53qsIHtlaAg6rKD7J6F64uI64ukLgoKLSDriIggOiDtirnsoJUg7JaR7J2YIOuIiOydtCDrgrTrprAg7ZuE7JeQIOunjCDsl63tlaDsnYTtlbTslbztlanri4jri6QuCi0g67mEIDog64iI7J20IOydvOygleufieydmCDqsJXsiJjrn4kg7ZuE7JeQIOunjCDsl63tlaDsnYTtlbTslbztlanri4jri6QuCgpgYGB7cn0KcGxvdDEgPSBkdHJhaW4gJT4lCiAgZ3JvdXBfYnkocGlja3VwX2hvdXIsIGhhc19zbm93KSAlPiUKICBzdW1tYXJpc2UoZHVyYXRpb24gPSBtZWFuKHRyaXBfZHVyYXRpb24pKSAlPiUKICBnZ3Bsb3QoYWVzKHBpY2t1cF9ob3VyLGR1cmF0aW9uLCBjb2xvciA9IGhhc19zbm93KSkgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4wMSwgc2l6ZSA9IDIpICsKICBsYWJzKHggPSAiaG91ciIsIHkgPSAidHJpcCBkdXJhdGlvbiIpCgpwbG90MiA9IGR0cmFpbiAlPiUgCiAgZ3JvdXBfYnkocGlja3VwX2hvdXIsIGhhc19zbm93KSAlPiUKICBzdW1tYXJpc2UoZGlzdGFuY2UgPSBtZWFuKGRpc3RhbmNlX2ttKSkgJT4lCiAgZ2dwbG90KGFlcyhwaWNrdXBfaG91cixkaXN0YW5jZSwgY29sb3IgPSBoYXNfc25vdykpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMDEsIHNpemUgPSAyKSArCiAgbGFicyh4ID0gImhvdXIiLCB5ID0gIkRpc3RhbmNlIENvdmVyZWQiKQoKZ3JpZC5hcnJhbmdlKHBsb3QxLCBwbG90MixuY29sPTEpCmBgYAoKLSDssqsg67KI7Ke4IOykhOqxsOumrOyXkOyEnCDriIjsnbQg64K066a0IOuVjCDslYTsuaggMTDsi5zsl5DshJwg7KCA64WBIDIw7IucIOyCrOydtOyXkCDriIjsnbQg64K066as7KeAIOyViuuKlCDrgqDsl5Ag67mE7ZW0IO2Pieq3oCDsl6ztlokg7IaM7JqUIOyLnOqwhOydtCDsp6fri6TripQg6rKw66Gg7J2EIOyWu+ydhCDsiJgg7J6I7Iq164uI64ukLiAKCi0g7J2867CY7KCB7Jy866GcIOqxt+qxsOuCmCDsnpDsoITqsbDrpbwg7YOA64qUIOyCrOuejOuTpOyXkOqyjCDriIjsnbQg64K066a0IOuVjCDrqqnsoIHsp4Dsl5Ag64+E64us7ZWY6riwIOychO2VtCDtg53si5zrpbwg7YOA6riwIOuVjOusuOyXkCDslYTso7wg7J207IOB7ZWY7KeAIOyViuyKteuLiOuLpC4KCmBgYHtyfQpwbG90MSA9IGR0cmFpbiAlPiUKICBncm91cF9ieShwaWNrdXBfaG91ciwgaGFzX3JhaW4pICU+JQogIHN1bW1hcmlzZShkdXJhdGlvbiA9IG1lYW4odHJpcF9kdXJhdGlvbikpICU+JQogIGdncGxvdChhZXMocGlja3VwX2hvdXIsZHVyYXRpb24sIGNvbG9yID0gaGFzX3JhaW4pKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjAxLCBzaXplID0gMikgKwogIGxhYnMoeCA9ICJob3VyIiwgeSA9ICJ0cmlwIGR1cmF0aW9uIikKCnBsb3QyID0gZHRyYWluICU+JSAKICBncm91cF9ieShwaWNrdXBfaG91ciwgaGFzX3JhaW4pICU+JQogIHN1bW1hcmlzZShkaXN0YW5jZSA9IG1lYW4oZGlzdGFuY2Vfa20pKSAlPiUKICBnZ3Bsb3QoYWVzKHBpY2t1cF9ob3VyLGRpc3RhbmNlLCBjb2xvciA9IGhhc19yYWluKSkgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4wMSwgc2l6ZSA9IDIpICsKICBsYWJzKHggPSAiaG91ciIsIHkgPSAiRGlzdGFuY2UgQ292ZXJlZCIpCgpncmlkLmFycmFuZ2UocGxvdDEsIHBsb3QyLG5jb2w9MSkKYGBgCgotIOu5hOqwgCDrgrTrpqzripQg64Kg6rO8IO2Pieq3oCDsl6ztlokg6riw6rCE7J20IOyVhOuLjCDrgqAg7IKs7J207JeQ64qUIOuzhCDssKjsnbTqsIAg7JeG7Iq164uI64ukLgoKLSDqt7jrn6zrgpgg64KY64qUIOu5hOyYpOuKlCDrgqDsl5Ag642u7Z6MIOqxsOumrOqwgCDruYTsmKTripQg64Kg6rO8IOu5hOq1kO2VmOyXrCDsoIHri6TripQg6rKD7J2EIOyVjCDsiJgg7J6I7Iq164uI64ukLiDsnbzrsJjsoIHsnLzroZwg7Ken7J2AIOqxsOumrOulvCDqsbfqsbDrgpgg7J6Q7KCE6rGw66W8IO2DgOuKlCDsgqzrnozrk6TsnbQg66qp7KCB7KeA66GcIO2DneyLnOulvCDtg4DripQg6rKD7J2EIOyEoO2YuO2VmOq4sCDrlYzrrLjsl5Ag7J206rKD7J2AIOuFvOumrOyggeyeheuLiOuLpC4KCi0gMjAxNiDrhYQgTllD7J2YIOuCoOyUqOyZgCDtlajqu5gg642w7J207YSwIOyEuO2KuOulvCDsgqzsmqntlZjquLDroZwg6rKw7KCVIO2WiOycvOuvgOuhnCDsnbQg642w7J207YSwIOyEuO2KuOulvCDtlansuZjroKTrqbQg66qHIOqwgOyngCDrjbDsnbTthLDqsIAg7ZWE7JqU7ZWp64uI64ukLgoKIyMgW01FVEFSXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NRVRBUikKCi0gTUVUQVLripQg64Kg7JSoIOygleuztOulvCDrs7Tqs6Ag7ZWY64qUIO2YleyLneyeheuLiOuLpC4gCi0gTUVUQVIg6riw7IOBIOyYiOuztOuKlCDruYTtlokg7KCEIOuCoOyUqCDruIzrpqztlZHsnZgg7J2867aA66W8IOyImO2Wie2VmOuKlCDsobDsooXsgqzsmYAg6riw7IOBIOyYiOy4oeyXkCDrj4Tsm4DsnbTrkJjripQg7KeR6rOEIOuQnCBNRVRBUiDsoJXrs7Trpbwg7IKs7Jqp7ZWY64qUIOq4sOyDgSDtlZnsnpDsl5Ag7J2Y7ZW0IOyjvOuhnCDsgqzsmqnrkKnri4jri6QuCgpgYGB7cn0KdHJhaW4gPC0gIGZyZWFkKCIuL2RhdGEvdHJhaW4uY3N2IikKCndlYXRoZXJfbnljIDwtICBmcmVhZCgiLi9kYXRhL0tOWUNfTWV0YXJzLmNzdiIpCgp0cmFpblssIHBpX2R0X3NoaWZ0IDo9ICBwYXN0ZShzdWJzdHIocGlja3VwX2RhdGV0aW1lLCAxLCAxMyksICI6MDA6MDAiLCBzZXAgPSAiIildCnRyYWluWywgZGZfZHRfc2hpZnQgOj0gcGFzdGUoc3Vic3RyKGRyb3BvZmZfZGF0ZXRpbWUsIDEsIDEzKSwgIjowMDowMCIsIHNlcCA9ICIiKV0KCnRyYWluX2pvaW5lZCA8LSBkcGx5cjo6bGVmdF9qb2luKHRyYWluLCB3ZWF0aGVyX255YywgYnkgID0gYygicGlfZHRfc2hpZnQiID0gIlRpbWUiKSkKCnRyYWluX2pvaW5lZCRDb25kaXRpb25zW2lzLm5hKHRyYWluX2pvaW5lZCRDb25kaXRpb25zKSA9PSAgVFJVRV0gPC0gIlVua25vd24iCgp3ZWF0aGVyX2NvbmRpdGlvbl9mcmVxIDwtIHRyYWluX2pvaW5lZCAlPiUKICBncm91cF9ieShDb25kaXRpb25zKSAlPiUKICBzZWxlY3QoQ29uZGl0aW9ucyx0cmlwX2R1cmF0aW9uICkgJT4lCiAgc3VtbWFyaXplKGNvdW50ID0gbigpLCAKICAgICAgICAgICAgbWVhbl9kdXIgPSBtZWFuKHRyaXBfZHVyYXRpb24sIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICBzZF9kdXIgPSAgIHNkKHRyaXBfZHVyYXRpb24sIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICBtZWRpYW5fZHVyID0gbWVkaWFuKHRyaXBfZHVyYXRpb24sIG5hLnJtID0gVFJVRSkpCgoKZGF0YXRhYmxlKHdlYXRoZXJfY29uZGl0aW9uX2ZyZXEpCmBgYAoKLSDslYTrnpjsnZgg6re466a87J2AIOyCrOyaqeyekOqwgCDtlL3sl4Ug7YOd7Iuc66W8IOuLpOuluCDquLDsg4Eg7KGw6rG07JeQIOyWvOuniOuCmCDsnpDso7wg7J2Y7KG07ZWY64qU7KeAIOuztOyXrOykjeuLiOuLpC4KCi0gTkHqsIAg7J6I64qUIOyhsOqxtCDqsJLsnYQgJ+yVjOyImCDsl4bripQg7Lm07YWM6rOg66asJ+uhnCDrs4Dqsr3tlZjquLDroZwg6rKw7KCV7ZaI7Iq164uI64ukLgoKLSDqsIDsnqUg67mI67KI7ZWcIOq3uOujueydgCAnQ2xlYXInIOyhsOqxtOydhCDqsIDsp4Qg6re466O57J20652864qUIOqyg+ydtCDrtoTrqoXtlanri4jri6QuCgpgYGB7cn0KaGlnaGNoYXJ0KCklPiUKICBoY19hZGRfc2VyaWVzKHdlYXRoZXJfY29uZGl0aW9uX2ZyZXEsICJzcGxpbmUiLCBoY2Flcyh4ID0gIENvbmRpdGlvbnMsIHkgPSBtZWFuX2R1ciksIG5hbWUgPSAiTWVhbiBUcmlwIER1cmF0aW9uIikgJT4lCiAgaGNfYWRkX3Nlcmllcyh3ZWF0aGVyX2NvbmRpdGlvbl9mcmVxLCAic3BsaW5lIiwgaGNhZXMoeCA9ICBDb25kaXRpb25zLCB5ID0gbWVkaWFuX2R1ciksIG5hbWUgPSAiTWVkaWFuIFRyaXAgRHVyYXRpb24iKSAlPiUKICBoY19hZGRfc2VyaWVzKHdlYXRoZXJfY29uZGl0aW9uX2ZyZXEsICJzcGxpbmUiLCBoY2Flcyh4ID0gIENvbmRpdGlvbnMsIHkgPSBzZF9kdXIpLCBuYW1lID0gIlNEIFRyaXAgRHVyYXRpb24iKSAlPiUKICBoY19wbG90T3B0aW9ucyhzZXJpZXMgPSBsaXN0KAogICAgc2hvd0luTGVnZW5kID0gVFJVRSwgCiAgICBwb2ludEZvcm1hdCA9ICJ7cG9pbnQueX0lIgogICksIAogIGNvbHVtbiA9IGxpc3QoY29sb3JCeVBvaW50ID0gVFJVRSkpICU+JQogIGhjX3N1YnRpdGxlKHRleHQgPSAiQ291bnQgYnkgQ29uZGl0aW9ucyBDYWVnb3JpZXMiKSAlPiUKICBoY19jcmVkaXRzKAogICAgZW5hYmxlZCA9IFRSVUUsIAogICAgdGV4dCA9ICJTb3VyY2U6IEthZ2dsZSIsIAogICAgaHJlZiA9ICJodHRwczovL2thZ2dsZS5jb20vZGFtaWFucGFuZWsiLCAKICAgIHN0eWxlID0gbGlzdChmb250U2l6ZSA9ICIxMnB4IikKICApICU+JQogIGhjX2FkZF90aGVtZShoY190aGVtZV9nb29nbGUoKSkKYGBgCgotIOyekeydgCDrjbDsnbTthLAg67OA7ZmYLiDsnbwgLyDsm5Qg67CPIOq0gOywsCDsmpTsnbzsl5Ag64yA7ZWcIOygleuztOulvCDslrvqs6Ag7Iu27Iq164uI64ukLgoKYGBge3J9CnRyYWluX2pvaW5lZCA8LSBkYXRhLnRhYmxlKHRyYWluX2pvaW5lZCkKdHJhaW5fam9pbmVkIDwtIHRyYWluX2pvaW5lZFtpcy5uYShwaWNrdXBfZGF0ZXRpbWUpID09IEZBTFNFLCAgXQoKdHJhaW5fam9pbmVkWywgcGlja3VwX2RhdGV0aW1lIDo9IGFzLlBPU0lYY3QocGlja3VwX2RhdGV0aW1lLCBmb3JtYXQgPSAiJVktJW0tJWQgJUg6JU06JVMiKV0KdHJhaW5fam9pbmVkWywgZHJvcG9mZl9kYXRldGltZSA6PSBhcy5QT1NJWGN0KGRyb3BvZmZfZGF0ZXRpbWUsIGZvcm1hdCA9ICIlWS0lbS0lZCAlSDolTTolUyIpXQp0cmFpbl9qb2luZWRbLCBwaWNrdXBfZGF5IDo9IGZvcm1hdChwaWNrdXBfZGF0ZXRpbWUsICIlWS0lbS0lZCIpXQp0cmFpbl9qb2luZWRbLCBwaWNrdXBfbW9udGggOj0gZm9ybWF0KHBpY2t1cF9kYXRldGltZSwgIiVZLSVtIildCgp0cmFpbl9qb2luZWRbLCBkcm9wb2ZmX2RheSA6PSBmb3JtYXQoZHJvcG9mZl9kYXRldGltZSwgIiVZLSVtLSVkIildCnRyYWluX2pvaW5lZFssIGRyb3BvZmZfbW9udGggOj0gZm9ybWF0KGRyb3BvZmZfZGF0ZXRpbWUsICIlWS0lbSIpXQoKdHJhaW5fam9pbmVkWywgd2Vla2RheSA6PSB3ZWVrZGF5cyhwaWNrdXBfZGF0ZXRpbWUpXQpgYGAKCi0gU3VtbWFyeSBTdGF0aXN0aWNzIGZvciBUZW1wZXJ0YXJ1cmUgaW4gTllDIHRheGkgZGF0YXNldAoKYGBge3J9CndlYXRoZXJfdGVtcF9kYXkgPC0gIHRyYWluX2pvaW5lZCAlPiUgCiAgZ3JvdXBfYnkocGlja3VwX2RheSkgJT4lCiAgc2VsZWN0KHBpY2t1cF9kYXksIFRlbXAuLCBDb25kaXRpb25zKSAlPiUKICBzdW1tYXJpemUoY291bnQgPSBuKCksIAogICAgICAgICAgICBtaW4gPSBtaW4oVGVtcC4sIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICBtYXggPSBtYXgoVGVtcC4sIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICBzZF9kdXIgPSBzZChUZW1wLiwgbmEucm0gPSBUUlVFKSkKCmhjaGFydCh3ZWF0aGVyX3RlbXBfZGF5LCAKICAgICAgICB0eXBlID0gImNvbHVtbnJhbmdlIiwgCiAgICAgICAgaGNhZXMoeCA9IHBpY2t1cF9kYXksIGxvdyA9IG1pbiwgaGlnaCA9IG1heCwgY29sb3IgPSBzZF9kdXIpKSAlPiUKICAgICAgICBoY19jaGFydChwb2xhciA9IFRSVUUpICU+JQogICAgaGNfeUF4aXMobWF4ID0gMzAsICBtaW4gPSAtMTAsIGxhYmVscyA9IGxpc3QoZm9ybWF0ID0gInt2YWx1ZX0gIiksIAogICAgICAgICAgICAgc2hvd0ZpcnN0TGFiZWwgPSBGQUxTRSkgJT4lCiAgaGNfeEF4aXMoCiAgdGl0bGUgPSBsaXN0KHRleHQgPSAiIiksIGdyaWRMaW5lV2lkdGggPSAwLjUsCiAgbGFiZWxzID0gbGlzdChmb3JtYXQgPSAie3ZhbHVlOiAlYn0iKSkgJT4lCiAgaGNfYWRkX3RoZW1lKGhjX3RoZW1lX2dvb2dsZSgpKSAlPiUKaGNfdGl0bGUodGV4dCA9ICJNaW4vTWF4IHRlbXBlcmF0dXJlIGRhaWx5LCBjb2xvdXJlZCBieSBTRChUZW1wKSIpCmBgYAoKIyMgTGVhZmxldCBzZWN0aW9uCi0g66i87KCAIOyInOyEnOulvCDrp4zrk6TroKTrqbQg7ZaJ7J2EIOuBjOyWtOyEnCDshKDtg53tlbTslbwg7ZWp64uI64ukLiDri6TsnYwgbWFrZWNsdXN0ZXIg7Ji17IWY7J2EIOyCrOyaqe2VmOyXrCDsoITri6jsnYQg7J6R7ISx7ZWY6riw66GcIOqysOygle2WiOyKteuLiOuLpC4KCmBgYHtyfQojaW5zdGFsbC5wYWNrYWdlcygnbGVhZmxldC5leHRyYXMnKQpsaWJyYXJ5KGxlYWZsZXQpCmxpYnJhcnkobGVhZmxldC5leHRyYXMpCgpsb25fbGF0IDwtIHRyYWluX2pvaW5lZFssIGMoInBpY2t1cF9sb25naXR1ZGUiLCAicGlja3VwX2xhdGl0dWRlIiwgCiJkcm9wb2ZmX2xvbmdpdHVkZSIsICJkcm9wb2ZmX2xhdGl0dWRlIildCgpsb25fbGF0JHJvd24gPC0gYXMubnVtZXJpYyhyb3duYW1lcyhsb25fbGF0KSkKCmxvbl9taW4gPC0gbG9uX2xhdFtyb3duIDwgMzAwICxdCnN0cihsb25fbWluKQpkcm9wIDwtIGxvbl9taW5bLCBjKCJwaWNrdXBfbG9uZ2l0dWRlIiwgInBpY2t1cF9sYXRpdHVkZSIsICJyb3duIildCnBpY2sgPC0gbG9uX21pblssIGMoImRyb3BvZmZfbG9uZ2l0dWRlIiwgImRyb3BvZmZfbGF0aXR1ZGUiLCAicm93biIpXQoKY29sbmFtZXMoZHJvcCkgIDwtIGMoImxvbiIsICJsYXQiLCAicm93biIpCmNvbG5hbWVzKHBpY2spIDwtIGNvbG5hbWVzKGRyb3ApCgphbGxfYmluX21pbiA8LSBiaW5kX3Jvd3MoZHJvcCwgcGljaykKYWxsX2Jpbl9taW4kcm93bjIgPC0gcmVwKDE6bnJvdyhhbGxfYmluX21pbikrMS8yLGVhY2ggPSAyKQoKCmxlYWZsZXQoZGF0YSA9IGFsbF9iaW5fbWluKSAlPiUgYWRkVGlsZXMoKSAlPiUKICBhZGRDaXJjbGVzKH5sb24sIH5sYXQpICU+JQogIGFkZFBvbHlnb25zKGRhdGEgPSBhbGxfYmluX21pbiwgbG5nID0gfmxvbiwgCiAgICAgICAgICAgICAgIGxhdCA9IH5sYXQsIAogICAgICAgICAgICAgICBzdHJva2UgPSAwLjAzLCBjb2xvciA9ICAiYmx1ZSIsIHdlaWdodCA9IDAuNCwgCiAgICAgICAgICAgICAgIG9wYWNpdHkgPSAxLjIpICAlPiUgZW5hYmxlTWVhc3VyZVBhdGgoKSAKYGBgCgotIExlYWZsZXggcGxvdCB3aXRoIG1ha2VjbHVzdGVyIG9wdGlvbnMgCgpgYGB7cn0KIGxlYWZsZXQoZGF0YSA9IHRyYWluX2pvaW5lZFsxOjUwMDAwLCBdKSAlPiUgYWRkVGlsZXMoKSAlPiUKICBhZGRNYXJrZXJzKH5waWNrdXBfbG9uZ2l0dWRlLCB+cGlja3VwX2xhdGl0dWRlLCBjbHVzdGVyT3B0aW9ucyA9IG1hcmtlckNsdXN0ZXJPcHRpb25zKCkpIApgYGAKCi0gTGVhZmxldCBoZWF0bWFwIAoKYGBge3J9CnRyYWluX2NvdW50IDwtIHRyYWluX2pvaW5lZCAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QocGlja3VwX2xhdGl0dWRlLCBwaWNrdXBfbG9uZ2l0dWRlKSAlPiUKICAgICAgICAgICAgICAgIGdyb3VwX2J5KHBpY2t1cF9sYXRpdHVkZSwgcGlja3VwX2xvbmdpdHVkZSkgJT4lCiAgICAgICAgICAgICAgICBzdW1tYXJpemUoY291bnQgPSBuKCkpCgoKdHJhaW5fY291bnQgPC0gdHJhaW5fY291bnRbdHJhaW5fY291bnQkY291bnQgPjEsXQoKCgogbGVhZmxldChkYXRhID0gdHJhaW5fY291bnQpICU+JSBhZGRUaWxlcygpICU+JSAKIGFkZEhlYXRtYXAobG5nID0gfnBpY2t1cF9sb25naXR1ZGUsIGxhdCA9IH5waWNrdXBfbGF0aXR1ZGUsIGludGVuc2l0eSA9IH5jb3VudCwKICAgICAgICAgICAgIGJsdXIgPSAyMCwgbWF4ID0gMC4wNSwgcmFkaXVzID0gMTUpCmBgYAoKLSBQaWNrdXAgZ3JvdXBlZCBieSBtb250aAoKYGBge3J9CnRyYWluX2NvdW50IDwtIHRyYWluX2pvaW5lZCAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QocGlja3VwX2xhdGl0dWRlLCBwaWNrdXBfbG9uZ2l0dWRlLCBwaWNrdXBfbW9udGgpICU+JQogICAgICAgICAgICAgICAgZ3JvdXBfYnkocGlja3VwX2xhdGl0dWRlLCBwaWNrdXBfbG9uZ2l0dWRlLCBwaWNrdXBfbW9udGgpICU+JQogICAgICAgICAgICAgICAgc3VtbWFyaXplKGNvdW50ID0gbigpKQoKdHJhaW5fY291bnQgPC0gdHJhaW5fY291bnRbdHJhaW5fY291bnQkY291bnQgPjEsXQoKCiBsZWFmbGV0KGRhdGEgPSB0cmFpbl9jb3VudCkgJT4lIGFkZFRpbGVzKCkgJT4lIAogYWRkSGVhdG1hcChsbmcgPSB+cGlja3VwX2xvbmdpdHVkZSwgbGF0ID0gfnBpY2t1cF9sYXRpdHVkZSwKIGxheWVySWQgPSB+cGlja3VwX21vbnRoLCBncm91cCA9IH5waWNrdXBfbW9udGgsIGludGVuc2l0eSA9IH5jb3VudCwKICAgICAgICAgICAgIGJsdXIgPSAyMCwgbWF4ID0gMC4wNSwgcmFkaXVzID0gMTUpCmBgYAoKLSBGcmVxdWVuY3kgYnkgIGRheSBvZiB3ZWVrIDopCgpgYGB7cn0KY291bnRfd2Vla2RheSA8LSB0cmFpbl9qb2luZWQgJT4lCiAgICAgICAgICAgICAgICAgIHNlbGVjdCh3ZWVrZGF5KSAlPiUKICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkod2Vla2RheSkgJT4lCiAgICAgICAgICAgICAgICAgIHN1bW1hcml6ZShjb3VudCA9IG4oKSkKCmNvdW50X3dlZWtkYXkgPC0gZGF0YS50YWJsZShjb3VudF93ZWVrZGF5KQoKCmNvdW50X3dlZWtkYXkgPC0gY291bnRfd2Vla2RheVtpcy5uYSh3ZWVrZGF5KSAgPT0gIEZBTFNFLCBdCgpjb3VudF93ZWVrZGF5IDwtIGRhdGEuZnJhbWUoY291bnRfd2Vla2RheSkKCnRtIDwtIHRyZWVtYXAoY291bnRfd2Vla2RheSAsIGluZGV4ID0gYygid2Vla2RheSIpLAogICAgICAgICAgICAgIHZTaXplID0gImNvdW50IikKCmhjdHJlZW1hcCh0bSkKYGBgCgo=